1. 程式人生 > >Netty入門之WebSocket(二)

Netty入門之WebSocket(二)

什麼是WebSocket:是一種H5協議規範

解決客戶端與服務端實時通訊而產生的技術:WebSocket本質是一種基於TCP協議,先通過Http/Https發一個特殊的Http請求進行握手,握手後會建立一個用於交換資料的TCP連結,之後客戶端和服務端使用該TCP連結進行實時通訊。當WebSocket的客戶端和服務端握手後 建立通訊後,就不再需要之前的http請求參與。

WebSocket優點:

1、節省通訊開銷:之前WebServer實現通訊,都使用輪詢(每隔特定時間間隔瀏覽器自動傳送Http請求,去獲取服務端的響應)該情況下,需要不停的向伺服器傳送請求,而HttpRequest的handler很長,請求包含真正的資料可能很小,會佔用很多額外的頻寬和伺服器資源。

2、伺服器可主動傳送資料給客戶端:

在給定時間,伺服器和客戶端在任意時刻相互推送資訊,瀏覽器(客戶端)和伺服器只需要做一個握手的動作。建立連線後,伺服器可主動傳資料給客戶端,客戶端也可以隨意向服務端傳資料。交換資料時所攜帶的頭資訊很小。

3、實時通訊:

WebSocket不僅限於Ajax方式通訊。ajax方式需要瀏覽器發起請求。而WebSocket技術 服務端和客戶端可以彼此相互推送資訊,從而實現實時通訊。

WebSocket建立連線過程:

1、客戶端發起握手請求。

2、服務端響應請求。

3、建立連結。

詳細流程:

瀏覽器首先向伺服器傳送一個特殊的Http請求(攜帶一些附加頭資訊)Upgrade:websocket,服務端解析附加頭資訊,產生應答訊息,然後響應給客戶端。之後客戶端就與服務端建立響應的連結。

WebSocket生命週期:

1、開啟事件:端點上建立新連結時,該事件是先於其他任何事件發生之前。該事件發生會產生三部分資訊。

1.1、建立WebSocket Session物件:用於表示已經建立好的連結

1.2、配置物件:包含配置端點的資訊。

1.3、一組路徑引數,開啟節點握手時,socket端入棧匹配的URI

2、訊息事件:主要是接收WebSocket對話中,另一端傳送的訊息。連結上的訊息將會有三種形式抵達客戶端。

2.1、文字訊息 用String處理

2.2、二進位制訊息 用byteBuffer或者byte[]處理

2.3、pong訊息 用java中pong.message介面的例項來處理

3、錯誤事件:WebSocket連結或者端點發生錯誤時產生。可以處理入棧訊息時發生的各種異常。入棧訊息可能產生的三種異常。

3.1、WebSocket建立連結時發生錯誤:SessionException

3.2、WebSocket試圖將入棧訊息解碼成開發人員使用的物件時 EncodeException

3.3、WebSocket端點的其他方法執行時產生的錯誤

4、關閉時間:WebSocket連結端點關閉,做一些清理工作,可以由參與的任意一個端點發出。

WebSocket如何關閉連結:

1、服務端關閉底層TCP連結

2、客戶端發起TCP Close

底層的TCP 正常情況下應該首先由伺服器關閉 在異常情況下客戶端可以發起TCP Close。

流程:當伺服器被指示關閉WebSocket連結時,服務端會發起一個TCP Close操作 客戶端等待伺服器的TCP Close