Rumah > Java > javaTutorial > teks badan

Bagaimanakah Java Websocket melaksanakan fungsi permainan dalam talian?

王林
Lepaskan: 2023-12-02 14:44:38
asal
1575 orang telah melayarinya

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!

sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!