建立 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);
    }
}