Java WebSocket
WebSocket 是一种基于 TCP 协议的全双工通信协议,可以实现客户端和服务器之间的实时通信。在 Java 中,我们可以使用 Java API for WebSocket(JSR 356)来实现 WebSocket。
WebSocket API
Java API for WebSocket 提供了一组 API,用于实现 WebSocket。以下是 WebSocket API 中的一些重要类和接口:
javax.websocket.Endpoint
:WebSocket 端点,用于处理 WebSocket 连接的生命周期。javax.websocket.Session
:WebSocket 会话,表示客户端和服务器之间的一次连接。javax.websocket.MessageHandler
:WebSocket 消息处理器,用于处理客户端发送的消息。javax.websocket.server.ServerEndpoint
:WebSocket 服务器端点,用于将 WebSocket 端点暴露为一个 URI。
实现 WebSocket 服务器
要实现 WebSocket 服务器,我们需要创建一个类,继承自 javax.websocket.Endpoint
类,并实现它的 onOpen
、onClose
、onError
和 onMessage
方法,分别用于处理 WebSocket 连接的打开、关闭、错误和消息。
以下是一个简单的 WebSocket 服务器的示例代码:
import java.io.IOException; import javax.websocket.Endpoint; import javax.websocket.EndpointConfig; import javax.websocket.MessageHandler; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/websocket") public class WebSocketServer extends Endpoint { @Override public void onOpen(Session session, EndpointConfig config) { System.out.println("WebSocket connection opened: " + session.getId()); session.addMessageHandler(new MessageHandler.Whole<String>() { @Override public void onMessage(String message) { System.out.println("Received message: " + message); try { session.getBasicRemote().sendText("Server received message: " + message); } catch (IOException e) { e.printStackTrace(); } } }); } @Override public void onClose(Session session, CloseReason closeReason) { System.out.println("WebSocket connection closed: " + session.getId() + " Reason: " + closeReason.getReasonPhrase()); } @Override public void onError(Session session, Throwable throwable) { System.err.println("WebSocket error occurred: " + session.getId()); throwable.printStackTrace(); } @Override public void onMessage(Session session, String message) { System.out.println("Received message: " + message); try { session.getBasicRemote().sendText("Server received message: " + message); } catch (IOException e) { e.printStackTrace(); } } }
在上面的示例中,我们创建了一个 WebSocketServer
类,并使用 @ServerEndpoint("/websocket")
注解将它暴露为 /websocket
URI。在onOpen
方法中,我们打印出 WebSocket 连接的 ID,并添加一个消息处理器,用于处理客户端发送的消息。在 onClose
和 onError
方法中,我们分别打印出 WebSocket 连接关闭和错误的信息。在 onMessage
方法中,我们打印出接收到的消息,并向客户端发送一个响应消息。
实现 WebSocket 客户端
要实现 WebSocket 客户端,我们可以使用 Java API for WebSocket 提供的 javax.websocket.ContainerProvider
类,通过它的getWebSocketContainer
方法获取一个 javax.websocket.WebSocketContainer
对象,然后使用它的 connectToServer
方法连接WebSocket 服务器。
以下是一个简单的 WebSocket 客户端的示例代码:
import java.net.URI; import javax.websocket.ClientEndpoint; import javax.websocket.OnMessage; import javax.websocket.Session; import javax.websocket.WebSocketContainer; import javax.websocket.ContainerProvider; @ClientEndpoint public class WebSocketClient { @OnMessage public void onMessage(String message) { System.out.println("Received message: " + message); } public static void main(String[] args) throws Exception { WebSocketContainer container = ContainerProvider.getWebSocketContainer(); URI uri = new URI("ws://localhost:8080/websocket"); try (Session session = container.connectToServer(WebSocketClient.class, uri)) { session.getBasicRemote().sendText("Hello, server!"); } } }
在上面的示例中,我们创建了一个 WebSocketClient
类,并使用 @ClientEndpoint
注解将它标记为 WebSocket 客户端。在onMessage
方法中,我们打印出接收到的消息。在 main
方法中,我们使用 ContainerProvider
类获取一个 WebSocketContainer
对象,并使用它的connectToServer
方法连接 WebSocket 服务器。在连接成功后,我们向服务器发送一个消息。