天天看點

Java WebSocket生命周期

    本章将講述WebSocket端點的生命周期。WebSocket端點的生命周期為開發人員提供了一個架構來管理端點所需要的資源,也提供了一個架構來攔截消息。我們将仔細探讨其生命周期的順序和語義,以及Java WebSocket API如何提供API和注解來支援處理這些事件。

一、WebSocket協定

    與基于HTTP的技術不同,WebSocket具有生命周期。此生命周期周期由WebSocket協定支撐。WebSocket協定定義了用戶端和伺服器長時間存活的專用的TCP連接配接,一旦連接配接已經建立,資料的傳輸就可以往返傳輸。WebSocket協定中包含兩種主要類型的幀:控制幀和資料幀。控制幀是用于執行協定的一些内部邏輯的資料傳輸。例如關閉幀(意味着發送者準備關閉連接配接)、Ping幀(檢查WebSocket對等節點的連接配接的健康性)。Pong幀(對Ping幀做出回應)。資料幀定義了攜帶應用資料的WebSocket傳輸的種類。資料幀分為兩類:文本型和二進制型(例如,圖像資料)。

二、WebSocket生命周期

    所有Java WebSocket端點生命周期的第一個事件是打開通知,它用來訓示到WebSocket會話另一端的連接配接已經建立。一旦打開通知被WebSocket對話的兩端都接收到,參與的任意WebSocket後續就可以發送消息了。在WebSocket對話期間,可能會出現一些消息傳遞的錯誤。接受消息的WebSocket端點本身就可能産生錯誤,或者WebSocket實作本身在某些情況下也會産生錯誤。要注意對錯誤的處理。不管在WebSocket對話的哪一端準備結束對話,他都可以初始化關閉事件。下面從Java元件的視角來看看其生命周期如何呈現。

打開事件:@OnOpen 此事件發生在端點上建立新連接配接時并且在任何其他事件發生之前

消息事件:@OnMessage 此事件接收WebSocket對話中另一端發送的消息。

錯誤事件:@OnError 此事件在WebSocket連接配接或者端點發生錯誤時産生

關閉事件:@OnClose 此事件表示WebSocket端點的連接配接目前部分地關閉,它可以由參與連接配接的任意一個端點發出

    你可能已經注意到,我用注解式來說明端點事件處理,這正是WebSocket所推薦的。雖然,你也可以用繼承式來程式設計這些事件

    @OnOpen 訓示當此端點建立新的連接配接時調用此方法。此事件伴随着三部分資訊:WebSocket Session對象,用于表示已經建立好的連接配接;配置對象(EndpointConfig的執行個體),包含了用來配置端點的資訊;一組路徑參數,用于打開階段握手時WebSocket端點入站比對URI。@OnOpen注解的方法是沒有任何傳回值的公有方法,這些方法有一個可選的Session參數、一個可選的EndpointConfig參數,以及任意數量的被@PathParam注解的String參數。

@OnMessage 處理入站的消息。連接配接上的消息将以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 可以用來注解多種不同類型的方法來關閉事件。

    下面将用一個紅綠燈示範了WebSocket的生命周期,示例連接配接:Lifecycle示例(一)、Lifecycle示例(二)