Bagaimanakah Java Websocket melaksanakan fungsi permainan dalam talian?
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.
- 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(); } }
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.
- 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(); } } }
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.
- 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; } }
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.
- 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."); } }
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.
- 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); }); });
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



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

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

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

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

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

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

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.

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
