Java Websocket は、TCP プロトコルに基づく全二重通信プロトコルであり、永続的な接続で双方向通信を実現できます。ゲームでは高速な対話とリアルタイム通信が必要となるため、Java Websocket はリアルタイム オンライン ゲームの開発に非常に適しています。
この記事では、Java Websocket を使用してオンライン ゲーム機能を実装する方法を紹介します。開発環境として Java 8 と Tomcat 8 を使用し、フロントエンド ページには HTML5 と JavaScript を使用します。
まず、WebSocket 接続を作成する必要があります。この機能は、WebSocket エンドポイントを作成することで実現できます。 JavaWeb アプリケーションでは、javax.websocket.Endpoint を使用して Websocket エンドポイントを構成できます。
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(); } }
このエンドポイントでは、4 つのアノテーションを定義します:
注: これは単なる例であり、実際のアプリケーションではさらに多くのエラー処理とセキュリティ チェックを実行する必要があります。
ゲーム セッションを管理するには、GameSessionManager クラスを作成する必要があります。 GameSessionManager は、すべての WebSocket 接続を管理し、ゲーム関連のメッセージを処理するために使用されるシングルトン クラスです。
以下は 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(); } } }
このクラスでは、すべての WebSocket セッションを保存するための Session コレクションを作成します。 getInstance() メソッドを使用して、GameSessionManager のシングルトン オブジェクトを取得します。 WebSocket 接続を追加または削除する場合は、コレクションに対して接続を追加または削除するだけです。メッセージをブロードキャストするときは、すべての WebSocket セッションをループして、それぞれの WebSocket セッションにメッセージを送信します。メッセージを送信するときは、session.getBasicRemote() メソッドを使用して基本リモート ポートを取得し、次に sendText() メソッドを呼び出してメッセージをクライアントに送信します。
クライアントからのゲーム メッセージを GameSessionManager クラスで処理し、クライアントに送り返します。ここではゲームロジックについても扱います。
ここでは、例として「こんにちは」と「さようなら」操作を含む単純な「チャット」ゲームを示します。
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; } }
この実装では、最初に受信したメッセージを JSON 形式として解析します。次に、メッセージの「アクション」フィールドを確認し、さまざまな操作に基づいて適切なアクションを実行します。アクションが「hello」の場合、メッセージからプレーヤーの名前を取得し、ブロードキャスト メソッドを使用してすべてのプレーヤーにウェルカム メッセージを送信します。操作が「さようなら」の場合、メッセージからプレイヤーの名前も取得し、ブロードキャスト メソッドを使用してすべてのプレイヤーにお別れのメッセージを送信します。それ以外の場合は、不明な操作を示すメッセージが出力されます。
フロントエンド ページは、HTML5 と JavaScript を使用して実装されます。 WebSocket を実装する JavaScript クラスを作成する必要があります。 JavaWeb アプリケーションでは、JavaScript の WebSocket オブジェクトを使用して WebSocket 接続を作成できます。
WebSocket を実装する JavaScript クラスは次のとおりです:
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."); } }
この実装では、まず WebSocket がサポートされているかどうかを確認します。その場合は、WebSocket のコンストラクターを使用して WebSocket オブジェクトを作成し、それを webSocket 変数に割り当てます。 3 つの WebSocket イベント ハンドラーを定義しました。
また、WebSocket オブジェクトの send メソッドを使用してメッセージをサーバーに送信する sendMessage 関数も定義します。
jQuery を使用してフロントエンド インタラクションを実装し、ゲーム メッセージをサーバーに送信します。
次は、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); }); });
この実装では、jQuery の $.parseJSON 関数を使用して、受信したメッセージを JSON 形式に解析します。次に、メッセージの「アクション」フィールドを確認し、さまざまな操作に基づいて適切なアクションを実行します。アクションが「hello」の場合、メッセージからプレイヤーの名前を取得し、ゲームに参加するためのメッセージを出力します。アクションが「バイ」の場合、メッセージからプレイヤーの名前も取得し、ゲームを終了するメッセージを出力します。それ以外の場合は、不明な操作を示すメッセージが出力されます。
我们还将为两个按钮分别定义单击事件,这些事件将生成相应的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端点,如何管理游戏会话,如何处理游戏消息,如何与前端进行交互,并提供了完整的代码示例。
以上がJava Websocket はオンライン ゲーム機能をどのように実装しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。