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.
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(); } }
Dalam titik akhir ini, kami mentakrifkan empat anotasi:
Nota: Ini hanyalah contoh mudah, lebih banyak pengendalian ralat dan semakan keselamatan perlu dilakukan dalam aplikasi sebenar.
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(); } } }
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.
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; } }
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.
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."); } }
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:
Kami juga mentakrifkan fungsi sendMessage, yang menggunakan kaedah hantar objek WebSocket untuk menghantar mesej ke pelayan.
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); }); });
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()函数向服务器发送消息。
现在我们已经完成了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>
结论
这篇文章主要介绍了使用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!