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