Java Websocket是一种基于TCP协议的全双工通信协议,可以在一个持久连接上实现双向通信。这使得Java Websocket非常适合实时在线游戏的开发,因为游戏需要快速的交互和实时的通信。
在本文中,我们将介绍如何使用Java Websocket实现在线游戏功能。我们将使用Java 8和Tomcat 8作为开发环境,前端页面使用HTML5和JavaScript。
- 建立WebSocket连接
首先,我们需要创建一个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(); } }
在这个端点中,我们定义了四个注解:
- @ServerEndpoint("/game")定义了这个端点的路径为“/game”。
- @OnOpen定义了这个端点在WebSocket打开时所做的操作,比如添加WebSocket连接到管理器中。
- @OnMessage定义了这个端点在WebSocket接收到消息时所做的操作,比如将消息发送到所有连接的WebSocket客户端。
- @OnClose定义了这个端点在WebSocket关闭时所做的操作,比如将WebSocket连接从管理器中移除。
- @OnError定义了这个端点在WebSocket发生错误时所做的操作。
注意:这只是一个简单的示例,实际应用中应该进行更多的错误处理和安全性检查。
- 管理游戏会话
我们需要创建一个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(); } } }
在这个类中,我们创建了一个Session的集合,用于存储所有WebSocket会话。使用getInstance()方法获取GameSessionManager的单例对象。在添加和移除WebSocket连接时,我们只需将该连接添加到集合中或从集合中删除。广播消息时,我们遍历所有WebSocket会话并将消息发送给每个会话。在发送消息时,我们使用session.getBasicRemote()方法获取基本的远程端口,然后调用sendText()方法将消息发送到客户端。
- 处理游戏消息
我们将在GameSessionManager类中处理来自客户端的游戏消息,并将其发送回客户端。我们还将在这里处理游戏逻辑。
此处以一个简单的带有“hello”和“bye”操作的“chat”游戏为例:
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”,我们从消息中获取玩家的名称并使用广播方法将欢迎消息发送给所有玩家。如果操作是“bye”,我们同样从消息中获取玩家的名称并使用广播方法将分别告别消息发送给所有玩家。否则,我们将打印未知操作的消息。
- 建立前端页面
前端页面使用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变量。我们定义了三个WebSocket事件处理程序:
- websocket.onopen在WebSocket打开时所做的操作,比如向服务器发起连接请求。
- websocket.onmessage定义了WebSocket接收到消息时所做的操作,比如调用handleMessage函数处理消息。
- websocket.onclose定义了WebSocket关闭时所做的操作,比如尝试重新连接。
我们还定义了一个sendMessage函数,该函数使用WebSocket对象的send方法将消息发送到服务器。
- 实现前端交互
我们将使用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”,我们从消息中获取玩家的名称并打印加入游戏的消息。如果操作是“bye”,我们同样从消息中获取玩家的名称并打印离开游戏的消息。否则,我们将打印未知操作的消息。
我们还将为两个按钮分别定义单击事件,这些事件将生成相应的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端点,如何管理游戏会话,如何处理游戏消息,如何与前端进行交互,并提供了完整的代码示例。