Rumah Java javaTutorial Bagaimanakah Java Websocket melaksanakan fungsi permainan dalam talian?

Bagaimanakah Java Websocket melaksanakan fungsi permainan dalam talian?

Dec 02, 2023 pm 02:44 PM
java websocket permainan dalam talian

Java Websocket如何实现在线游戏功能?

Java Websocket ialah protokol komunikasi dupleks penuh berdasarkan protokol TCP, yang boleh mencapai komunikasi dua hala pada sambungan yang berterusan. Ini menjadikan Java Websocket sangat sesuai untuk pembangunan permainan dalam talian masa nyata, kerana permainan memerlukan interaksi pantas dan komunikasi masa nyata.

Dalam artikel ini, kami akan memperkenalkan cara menggunakan Java Websocket untuk melaksanakan fungsi permainan dalam talian. Kami akan menggunakan Java 8 dan Tomcat 8 sebagai persekitaran pembangunan, dan halaman hadapan menggunakan HTML5 dan JavaScript.

  1. Mewujudkan sambungan WebSocket

Pertama, kita perlu membuat sambungan WebSocket. Kita boleh mencapai fungsi ini dengan menulis titik akhir WebSocket. Dalam aplikasi JavaWeb, kami boleh mengkonfigurasi titik akhir Websocket menggunakan javax.websocket.Endpoint.

Berikut ialah pelaksanaan titik akhir Websocket:

@ServerEndpoint("/game")
public class GameEndpoint {

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("WebSocket Opened: " + session.getId());
        GameSessionManager.getInstance().addSession(session); // 将Session加入管理器
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("WebSocket Message received: " + message);
        GameSessionManager.getInstance().handleMessage(message, session); // 处理消息
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("WebSocket Closed: " + session.getId());
        GameSessionManager.getInstance().removeSession(session); // 将Session从管理器中移除
    }

    @OnError
    public void onError(Throwable throwable) {
        throwable.printStackTrace();
    }
}
Salin selepas log masuk

Dalam titik akhir ini, kami mentakrifkan empat anotasi:

  • @ServerEndpoint("/game") mentakrifkan laluan titik akhir ini sebagai "/permainan".
  • @OnOpen mentakrifkan perkara yang dilakukan oleh titik akhir ini apabila WebSocket dibuka, seperti menambah sambungan WebSocket kepada pengurus.
  • @OnMessage mentakrifkan perkara yang dilakukan oleh titik akhir ini apabila WebSocket menerima mesej, seperti menghantar mesej kepada semua pelanggan WebSocket yang disambungkan.
  • @OnClose mentakrifkan perkara yang dilakukan oleh titik akhir ini apabila WebSocket ditutup, seperti mengalih keluar sambungan WebSocket daripada pengurus.
  • @OnError mentakrifkan perkara yang dilakukan oleh titik akhir ini apabila ralat WebSocket berlaku.

Nota: Ini hanyalah contoh mudah, lebih banyak pengendalian ralat dan semakan keselamatan perlu dilakukan dalam aplikasi sebenar.

  1. Urus sesi permainan

Kami perlu mencipta kelas GameSessionManager untuk mengurus sesi permainan. GameSessionManager ialah kelas tunggal yang digunakan untuk mengurus semua sambungan WebSocket dan mengendalikan mesej berkaitan permainan.

Berikut ialah pelaksanaan GameSessionManager:

public class GameSessionManager {

    private Set<Session> sessions = new HashSet<>();
    private static GameSessionManager instance;

    private GameSessionManager() {
    }

    public static GameSessionManager getInstance() {
        if (instance == null) {
            synchronized (GameSessionManager.class) {
                if (instance == null) {
                    instance = new GameSessionManager();
                }
            }
        }
        return instance;
    }

    public void addSession(Session session) {
        sessions.add(session);
    }

    public void removeSession(Session session) {
        sessions.remove(session);
    }

    public void handleMessage(String message, Session session) {
        // TODO 处理消息
    }

    public void broadcast(String message) {
        for (Session session : sessions) {
            send(message, session);
        }
    }

    public void send(String message, Session session) {
        try {
            session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Salin selepas log masuk

Dalam kelas ini, kami mencipta koleksi Sesi untuk menyimpan semua sesi WebSocket. Gunakan kaedah getInstance() untuk mendapatkan objek tunggal GameSessionManager. Apabila menambah dan mengalih keluar sambungan WebSocket, kami hanya menambah atau mengalih keluar sambungan ke koleksi. Apabila menyiarkan mesej, kami mengulangi semua sesi WebSocket dan menghantar mesej kepada setiap satu. Apabila menghantar mesej, kami menggunakan kaedah session.getBasicRemote() untuk mendapatkan port jauh asas, dan kemudian memanggil kaedah sendText() untuk menghantar mesej kepada klien.

  1. Mengendalikan Mesej Permainan

Kami akan mengendalikan mesej permainan daripada pelanggan dalam kelas GameSessionManager dan menghantarnya kembali kepada pelanggan. Kami juga akan berurusan dengan logik permainan di sini.

Berikut ialah permainan "sembang" mudah dengan operasi "hello" dan "bye" sebagai contoh:

public void handleMessage(String message, Session session) {
    JSONObject json = new JSONObject(message);
    String action = json.getString("action");
    switch (action) {
        case "hello":
            String name = json.optString("name");
            broadcast(name + " joined the game.");
            break;
        case "bye":
            String playerName = json.optString("name");
            broadcast(playerName + " left the game.");
            break;
        default:
            System.out.println("Unknown action: " + action);
            break;
    }
}
Salin selepas log masuk

Dalam pelaksanaan ini, kami mula-mula menghuraikan mesej yang diterima ke dalam format JSON. Kami kemudian menyemak medan "Tindakan" mesej dan melakukan tindakan yang sesuai berdasarkan operasi yang berbeza. Jika tindakan itu adalah "hello", kami mendapat nama pemain daripada mesej dan menggunakan kaedah penyiaran untuk menghantar mesej alu-aluan kepada semua pemain. Jika operasi adalah "bye", kami juga mendapat nama pemain daripada mesej dan menggunakan kaedah penyiaran untuk menghantar mesej perpisahan kepada semua pemain. Jika tidak, kami mencetak mesej untuk operasi yang tidak diketahui.

  1. Bina halaman depan hadapan

Halaman hujung hadapan dilaksanakan menggunakan HTML5 dan JavaScript. Kita perlu menulis kelas JavaScript yang melaksanakan WebSocket. Dalam aplikasi JavaWeb, kita boleh menggunakan objek WebSocket JavaScript untuk membuat sambungan WebSocket.

Berikut ialah kelas JavaScript yang melaksanakan WebSocket:

var webSocket = null;
var url = "ws://" + window.location.hostname + ":" + window.location.port + "/game";

function connectWebSocket() {
    if("WebSocket" in window) {
        webSocket = new WebSocket(url);

        webSocket.onopen = function(event) {
            console.log("WebSocket opened.");
        };

        webSocket.onmessage = function(event) {
            console.log("WebSocket message received: " + event.data);
            handleMessage(event.data);
        };

        webSocket.onclose = function(event) {
            console.log("WebSocket closed.");
        };
    } else {
        console.log("WebSocket is not supported by this browser.");
    }
}

function sendMessage(message) {
    if(webSocket) {
        webSocket.send(message);
    } else {
        console.log("WebSocket is not connected.");
    }
}
Salin selepas log masuk

Dalam pelaksanaan ini, kami mula-mula menyemak sama ada WebSocket disokong. Jika ya, kami akan mencipta objek WebSocket menggunakan pembina WebSocket dan menetapkannya kepada pembolehubah webSocket. Kami telah menentukan tiga pengendali acara WebSocket:

  • websocket.onopen Operasi yang dilakukan apabila WebSocket dibuka, seperti memulakan permintaan sambungan ke pelayan.
  • websocket.onmessage mentakrifkan operasi yang dilakukan oleh WebSocket apabila ia menerima mesej, seperti memanggil fungsi handleMessage untuk memproses mesej.
  • websocket.onclose mentakrifkan perkara yang perlu dilakukan apabila WebSocket ditutup, seperti cuba menyambung semula.

Kami juga mentakrifkan fungsi sendMessage, yang menggunakan kaedah hantar objek WebSocket untuk menghantar mesej ke pelayan.

  1. Laksanakan interaksi hadapan

Kami akan menggunakan jQuery untuk melaksanakan interaksi hadapan dan menghantar mesej permainan ke pelayan.

Berikut ialah pelaksanaan fungsi handleMessage:

function handleMessage(message) {
    var json = $.parseJSON(message);
    var action = json.action;
    switch (action) {
        case "hello":
            var name = json.name;
            console.log("Player " + name + " joined the game.");
            break;
        case "bye":
            var playerName = json.name;
            console.log("Player " + playerName + " left the game.");
            break;
        default:
            console.log("Unknown action: " + action);
            break;
    }
}

$(document).ready(function() {
    connectWebSocket();

    $("#btnHello").click(function(event) {
        var playerName = $("#txtName").val();
        var message = '{"action": "hello", "name": "' + playerName + '"}';
        sendMessage(message);
    });

    $("#btnBye").click(function(event) {
        var playerName = $("#txtName").val();
        var message = '{"action": "bye", "name": "' + playerName + '"}';
        sendMessage(message);
    });
});
Salin selepas log masuk

Dalam pelaksanaan ini, kami menggunakan fungsi $.parseJSON jQuery untuk menghuraikan mesej yang diterima ke dalam format JSON. Kami kemudian menyemak medan "Tindakan" mesej dan melakukan tindakan yang sesuai berdasarkan operasi yang berbeza. Jika tindakan itu ialah "hello", kami mendapat nama pemain daripada mesej dan mencetak mesej untuk menyertai permainan. Jika tindakan itu adalah "bye", kami juga mendapat nama pemain daripada mesej dan mencetak mesej meninggalkan permainan. Jika tidak, kami mencetak mesej untuk operasi yang tidak diketahui.

我们还将为两个按钮分别定义单击事件,这些事件将生成相应的JSON消息并使用'use SendMessage()函数向服务器发送消息。

  1. 测试

现在我们已经完成了Java Websocket实现在线游戏的所有工作。我们需要在Tomcat服务器上启动我们的应用程序并在浏览器中打开前端页面。我们可以使用多个浏览器测试在线游戏的功能。

下面是完整的游戏前端代码,供您参考:

<!doctype html>
<html>
<head>
    <title>WebSocket Chat</title>
    <meta charset="utf-8"/>
    <script src="https://code.jquery.com/jquery-3.5.0.min.js"></script>
    <script src="websockets.js"></script>
    <script>
        $(document).ready(function() {
            connectWebSocket();

            $("#btnHello").click(function(event) {
                var playerName = $("#txtName").val();
                var message = '{"action": "hello", "name": "' + playerName + '"}';
                sendMessage(message);
            });

            $("#btnBye").click(function(event) {
                var playerName = $("#txtName").val();
                var message = '{"action": "bye", "name": "' + playerName + '"}';
                sendMessage(message);
            });
        });

        function handleMessage(message) {
            var json = $.parseJSON(message);
            var action = json.action;
            switch (action) {
                case "hello":
                    var name = json.name;
                    console.log("Player " + name + " joined the game.");
                    break;
                case "bye":
                    var playerName = json.name;
                    console.log("Player " + playerName + " left the game.");
                    break;
                default:
                    console.log("Unknown action: " + action);
                    break;
            }
        }
    </script>
</head>
<body>
    <div>
        <label>Player name:</label>
        <input type="text" id="txtName"/>
        <button id="btnHello">Join game</button>
        <button id="btnBye">Leave game</button>
    </div>
</body>
</html>
Salin selepas log masuk

结论

这篇文章主要介绍了使用Java Websocket实现在线游戏的过程。我们在Java 8和Tomcat 8中开发了一个简单的“chat”游戏,并使用HTML5和JavaScript实现了前端。我们展示了如何使用WebSocket端点,如何管理游戏会话,如何处理游戏消息,如何与前端进行交互,并提供了完整的代码示例。

Atas ialah kandungan terperinci Bagaimanakah Java Websocket melaksanakan fungsi permainan dalam talian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Nombor Sempurna di Jawa Nombor Sempurna di Jawa Aug 30, 2024 pm 04:28 PM

Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Penjana Nombor Rawak di Jawa Penjana Nombor Rawak di Jawa Aug 30, 2024 pm 04:27 PM

Panduan untuk Penjana Nombor Rawak di Jawa. Di sini kita membincangkan Fungsi dalam Java dengan contoh dan dua Penjana berbeza dengan contoh lain.

Weka di Jawa Weka di Jawa Aug 30, 2024 pm 04:28 PM

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Nombor Smith di Jawa Nombor Smith di Jawa Aug 30, 2024 pm 04:28 PM

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Soalan Temuduga Java Spring Soalan Temuduga Java Spring Aug 30, 2024 pm 04:29 PM

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Cuti atau kembali dari Java 8 Stream Foreach? Cuti atau kembali dari Java 8 Stream Foreach? Feb 07, 2025 pm 12:09 PM

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

TimeStamp to Date in Java TimeStamp to Date in Java Aug 30, 2024 pm 04:28 PM

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Program Java untuk mencari kelantangan kapsul Program Java untuk mencari kelantangan kapsul Feb 07, 2025 am 11:37 AM

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4

See all articles