1. 程式人生 > >WebSocket的生命週期詳解

WebSocket的生命週期詳解

1、WebSocket端點的4個生命週期事件

  • 開啟事件: 此事件發生在端點建立新連線時並且在任何其他事件發生之前。
  • 訊息事件: 此事件接收 WebSocket 對話中另一端傳送的訊息。它可以發生在 WebSocket 端點接收了開啟事件之後並且在接收關閉事件關閉連線之前的任意時刻。
  • 錯誤事件: 此事件在 WebSocket 連線或者端點發生錯誤時產生。
  • 關閉事件: 此事件表示 WebSocket 端點的連線目前正在部分地關閉,它可以由參與連線的任意一個端點發出。

2、註解式端點事件處理

為了將 Java 類宣告成 WebSocket 端點,對於伺服器端端點來說需要使用一個類級別註解 @ServerEndpoint,對於客戶端端點來說需要使用類似的 @ClientEndpoint 註解。對於註解式端點來說,為了攔截不同的生命週期事件,我們需要以下方法級註解:@OnOpen @OnMessage @OnError @OnClose

  • @OnOpen

    此註解用於註解式端點的方法,指示當此端點建立新的連線時呼叫此方法。此事件伴隨著三部分資訊:
    1、WebSocket Session物件:用於表示已經建立好的連線(可選)。
    2、配置物件(EndpointConfig的例項),包含了用來配置端點的資訊(可選)。
    3、任意數量的被@PathParam 註解的 String 引數,用於開啟握手階段時 WebSocket 端點匹配入站 URI 過程中獲取的路徑引數。

  • @OnMessage

    此註解允許你裝飾你希望處理入站訊息的方法。訊息事件伴隨的資訊是:WebSocket Session 物件(表示訊息抵達時的連線),EndpointConfig 物件,開啟階段握手中從匹配入站URI過程中獲取的路徑引數以及最重要的訊息本身。
    連線上的訊息將以3種基本形式抵達:文字訊息、二進位制訊息或Pong訊息。JavaWebSocket API提供了一系列的選項使得能夠以這些形式接收訊息。最基本的形式是選擇使用帶String引數的方法來處理文字訊息;使用帶ByteBuffer或者是byte[]引數的方法來處理二進位制訊息;若你的訊息將僅僅處理Pong訊息,則可以使用JavaWebSocket API中的PongMessage介面的一個例項。
    1、文字訊息例子:

    @OnMessage
    public String echo(String incomingMessage) {
        return "I got this (" + incomingMessage + ")!!";
    }

對於二進位制和文字訊息,你可以選擇在訊息到來時分批的接收。可以使用一對引數來表示到來的訊息分片(partial message)。對文字訊息分片來說是String和boolean,其中String引數表示文字訊息分片,boolean引數表示該分片是否是序列中的最後一個訊息分片;對二進位制訊息分片來說,可以選擇一對引數ByteBuffer(或者byte[])和boolean,其中ByteBuffer(或者byte[])表示二進位制訊息分片,boolean引數表示該分片是否是序列中的最後一個訊息分片。

    @OnMessage
    public void echo(byte[] partialData, boolean isLast) {
        if (!isLast) {
            // 序列中還有更多的訊息分片進來
        } else {
            // 最後一個訊息分片
        }
    }

你也可以使用 Java I/O 流來處理輸入訊息( Reader 處理文字訊息,InputStream 處理二進位制訊息),甚至可以讓 WebSocket 實現吧入站訊息轉換成自己選擇的物件。
WebSocket應用一般是非同步的雙向訊息。一般情況下的 WebSocket 應用並不總是立即響應入站訊息。如果想要立刻響應入站訊息,可以通過將 @OnMessage 註解的方法的返回型別設定為有返回型別,那麼 WebSocket 實現立即將返回值作為訊息返回給剛剛在方法中處理的訊息的傳送者。

  • @OnError

    @OnError 可以用來註解 WebSocket 端點的方法,使其可以處理 WebSocket 實現處理入站訊息時發生的任何錯誤。伴隨錯誤事件的資訊是錯誤資訊、發生錯誤的會話以及與建立連線開啟階段握手相關聯的任何一個路徑引數。

    @OnError
    public void errorHandler(Throwable throwable) {
        // 錯誤處理方法
    }

處理入站訊息時的3中基本錯誤型別:

  • SessionException型別:非正常的 WebSocket 端點入站訊息。

  • DecodeException型別:WebSocket 試圖將入站訊息解碼轉成開發人員所需要的某個物件。

  • 其他:WebSocket 端點的其他方法產生的執行時錯誤。

  • @OnClose

    該註解對應攔截關閉事件。伴隨關閉事件的資訊:關閉資訊、與建立連線的開啟階段握手相關聯的任意一個路徑引數,以及描述連線關閉原因的資訊。

    @OnClose
    public void closeHandler(CloseReason closeReason) {
        // 關閉事件處理
    }