本章將講述WebSocket端點的生命週期。WebSocket端點的生命週期爲開發人員提供了一個框架來管理端點所須要的資源,也提供了一個框架來攔截消息。咱們將仔細探討其生命週期的順序和語義,以及Java WebSocket API如何提供API和註解來支持處理這些事件。java
1、WebSocket協議node
與基於HTTP的技術不一樣,WebSocket具備生命週期。今生命週期週期由WebSocket協議支撐。WebSocket協議定義了客戶端和服務器長時間存活的專用的TCP鏈接,一旦鏈接已經創建,數據的傳輸就能夠往返傳輸。WebSocket協議中包含兩種主要類型的幀:控制幀和數據幀。控制幀是用於執行協議的一些內部邏輯的數據傳輸。例如關閉幀(意味着發送者準備關閉鏈接)、Ping幀(檢查WebSocket對等節點的鏈接的健康性)。Pong幀(對Ping幀作出迴應)。數據幀定義了攜帶應用數據的WebSocket傳輸的種類。數據幀分爲兩類:文本型和二進制型(例如,圖像數據)。編程
2、WebSocket生命週期服務器
全部Java WebSocket端點生命週期的第一個事件是打開通知,它用來指示到WebSocket會話另外一端的鏈接已經創建。一旦打開通知被WebSocket對話的兩端都接收到,參與的任意WebSocket後續就能夠發送消息了。在WebSocket對話期間,可能會出現一些消息傳遞的錯誤。接受消息的WebSocket端點自己就可能產生錯誤,或者WebSocket實現自己在某些狀況下也會產生錯誤。要注意對錯誤的處理。無論在WebSocket對話的哪一端準備結束對話,他均可以初始化關閉事件。下面從Java組件的視角來看看其生命週期如何呈現。框架
打開事件:@OnOpen 此事件發生在端點上創建新鏈接時而且在任何其餘事件發生以前異步
消息事件:@OnMessage 此事件接收WebSocket對話中另外一端發送的消息。spa
錯誤事件:@OnError 此事件在WebSocket鏈接或者端點發生錯誤時產生code
關閉事件:@OnClose 此事件表示WebSocket端點的鏈接目前部分地關閉,它能夠由參與鏈接的任意一個端點發出對象
你可能已經注意到,我用註解式來講明端點事件處理,這正是WebSocket所推薦的。雖然,你也能夠用繼承式來編程這些事件繼承
@OnOpen 指示當此端點創建新的鏈接時調用此方法。此事件伴隨着三部分信息:WebSocket Session對象,用於表示已經創建好的鏈接;配置對象(EndpointConfig的實例),包含了用來配置端點的信息;一組路徑參數,用於打開階段握手時WebSocket端點入站匹配URI。@OnOpen註解的方法是沒有任何返回值的公有方法,這些方法有一個可選的Session參數、一個可選的EndpointConfig參數,以及任意數量的被@PathParam註解的String參數。
@OnMessage 處理入站的消息。java培訓機構裏面是這樣講解的,鏈接上的消息將以3種基本形式抵達:文本消息、二進制消息或者Pong消息。最基本的形式是選擇使用帶String參數的方法來處理文本消息;使用ByteBuffer或者是byte[]參數的方法來處理二進制文本;若你的消息僅僅是處理Pong消息,則可使用Java WebSocket API中的PongMessage接口的一個實例。固然可使用一個boolean型參數表示對到來的消息進行分片。當boolean型參數值爲false時,表示後續還有整個文本消息序列中的更多消息分片的到來,當設置爲true時,表示當前消息是消息分片中最後一個分片。消息的處理還有不少選項,好比使用JavaI/O,甚至可讓WebSocket實現把入站消息轉換成本身選擇的對象。這個將在消息通訊基礎中提到,WebSocket應用通常是異步的雙向消息。所以經過@OnMessage註解的此類方法上有一個額外選項:方法能夠有返回值或者返回爲空。當使用@OnMessage註解的方法有返回類型時,WebSocket實現當即將返回值做爲消息返回給剛剛在方法中處理的消息的發送者。
@OnError 能夠處理WebSocket實現處理入站消息時發生的任何異常。處理入站消息時,可能會發生3中基本的錯誤類型。首先,WebSocket實現產生的錯誤可能會發生,這些異常屬於SessionException類型,其次,錯誤可能會發生在當WebSocket實現試圖將入站消息解碼成開發人員所須要的對象時。此類錯誤都是DecodeException類型。最後是由WebSocket端點的其餘方法產生的運行時錯誤。WebSocket實現將記錄WebSocket端點操做過程當中產生的任何異常。
@OnClose 它對於在WebSocket鏈接關閉時作其餘的通用清理工做。@OnClose 能夠用來註解多種不一樣類型的方法來關閉事件。