创建 WebSocket 通信

WebSocket 通过单个 TCP 连接提供双工/双向通信协议。

  • 客户端打开与正在侦听 WebSocket 请求的服务器的连接
  • 客户端使用 URI 连接到服务器。
  • 服务器可以监听来自多个客户端的请求。

服务器端点

你可以通过使用 @ServerEndpoint 注释 POJO 来创建 WebSocket 服务器 entpoint。@OnMessage 修饰一个接收传入消息的方法。@OnOpen 可用于装饰在收到来自对等方的新连接时要调用的方法。类似地,当连接关闭时,调用用 @OnClose 注释的方法。

@ServerEndpoint("/websocket")
public class WebSocketServerEndpoint
{

    @OnOpen
    public void open(Session session) {
     System.out.println("a client connected");
    }

    @OnClose
    public void close(Session session) {
     System.out.println("a client disconnected");
    }

    @OnMessage
    public void handleMessage(String message) {
        System.out.println("received a message from a websocket client! " + message);
    }

}

客户端 Enpoint

与服务器端点类似,你可以通过使用 @ClientEndpoint 注释 POJO 来创建 WebSocket 客户端端点。

@ClientEndpoint
public class WebsocketClientEndpoint {

    Session userSession = null;
    
    // in our case i.e. "ws://localhost:8080/myApp/websocket"
    public WebsocketClientEndpoint(URI endpointURI) {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        container.connectToServer(this, endpointURI);
    }

    @OnOpen
    public void onOpen(Session userSession) {
        System.out.println("opening websocket");
        this.userSession = userSession;
    }

    @OnClose
    public void onClose(Session userSession, CloseReason reason) {
        System.out.println("closing websocket");
        this.userSession = null;
    }

    @OnMessage
    public void onMessage(String message) {
        System.out.println("received message: "+ message);
    }

    public void sendMessage(String message) {
        System.out.println("sending message: "+ message);
        this.userSession.getAsyncRemote().sendText(message);
    }
}