WebSocket學習筆記

傳統的請求-響應模式的 Web 開發在處理實時通訊方案,常見的是:

  • 輪詢,原理簡單易懂,就是客戶端通過一定的時間間隔以頻繁請求的方式向服務器發送請求,來保持客戶端和服務器端的數據同步。問題很明顯,當客戶端以固定頻率向服務器端發送請求時,服務器端的數據可能並沒有更新,帶來很多無謂請求,浪費帶寬,效率低下。


  • 基於 Flash,AdobeFlash 通過自己的 Socket 實現完成數據交換,再利用 Flash 暴露出相應的接口爲 JavaScript 調用,從而達到實時傳輸目的。此方式比輪詢要高效,且因爲 Flash 安裝率高,應用場景比較廣泛,但在移動互聯網終端上 Flash 的支持並不好。IOS 系統中沒有 Flash 的存在,在 Android 中雖然有 Flash 的支持,但實際的使用效果差強人意,且對移動設備的硬件配置要求較高。2012 年 Adobe 官方宣佈不再支持 Android4.1+系統,宣告了 Flash 在移動終端上的死亡。



可以看出,傳統 Web 模式在處理高併發及實時性需求的時候,會遇到難以逾越的瓶頸,我們需要一種高效節能的雙向通信機制來保證數據的實時傳輸。在此背景下,基於 HTML5 規範的、有 Web TCP 之稱的 WebSocket 應運而生。

 

WebSocket 的原理及運行機制。

WebSocket 是 HTML5 一種新的協議。它實現了瀏覽器與服務器全雙工通信,能更好的節省服務器資源和帶寬並達到實時通訊,它建立在 TCP 之上,同 HTTP 一樣通過 TCP 來傳輸數據,但是它和 HTTP 最大不同是:

  • WebSocket 是一種雙向通信協議,在建立連接後,WebSocket 服務器和 Browser/Client Agent 都能主動的向對方發送或接收數據,就像 Socket 一樣;
  • WebSocket 需要類似 TCP 的客戶端和服務器端通過握手連接,連接成功後才能相互通信。
                                             

           傳統HTTP請求響應客戶端服務器端交互圖                                     WebSocket請求響應客戶端服務器交互圖

上圖對比可以看出,相對於傳統 HTTP 每次請求-應答都需要客戶端與服務端建立連接的模式,WebSocket 是類似 Socket 的 TCP 長連接的通訊模式,一旦 WebSocket 連接建立後,後續數據都以幀序列的形式傳輸。在客戶端斷開 WebSocket 連接或 Server 端斷掉連接前,不需要客戶端和服務端重新發起連接請求。在海量併發及客戶端與服務器交互負載流量大的情況下,極大的節省了網絡帶寬資源的消耗,有明顯的性能優勢,且客戶端發送和接受消息是在同一個持久連接上發起,實時性優勢明顯。

我們再通過客戶端和服務端交互的報文看一下 WebSocket 通訊與傳統 HTTP 的不同:

在客戶端,new WebSocket 實例化一個新的 WebSocket 客戶端對象,連接類似 ws://yourdomain:port/path 的服務端 WebSocket URL,WebSocket 客戶端對象會自動解析並識別爲 WebSocket 請求,從而連接服務端端口,執行雙方握手過程,客戶端發送數據格式類似:

清單 1.WebSocket 客戶端連接報文
GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://localhost:8080
Sec-WebSocket-Version: 13

可以看到,客戶端發起的 WebSocket 連接報文類似傳統 HTTP 報文,”Upgrade:websocket”參數值表明這是 WebSocket 類型請求,“Sec-WebSocket-Key”是 WebSocket 客戶端發送的一個 base64 編碼的密文,要求服務端必須返回一個對應加密的“Sec-WebSocket-Accept”應答,否則客戶端會拋出“Error during WebSocket handshake”錯誤,並關閉連接。

服務端收到報文後返回的數據格式類似:

清單 2.WebSocket 服務端響應報文
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=

“Sec-WebSocket-Accept”的值是服務端採用與客戶端一致的密鑰計算出來後返回客戶端的,“HTTP/1.1 101 Switching Protocols”表示服務端接受 WebSocket 協議的客戶端連接,經過這樣的請求-響應處理後,客戶端服務端的 WebSocket 連接握手成功, 後續就可以進行 TCP 通訊了。讀者可以查閱WebSocket 協議棧瞭解 WebSocket 客戶端和服務端更詳細的交互數據格式。

在開發方面,WebSocket API 也十分簡單,我們只需要實例化 WebSocket,創建連接,然後服務端和客戶端就可以相互發送和響應消息,在下文 WebSocket 實現及案例分析部分,可以看到詳細的 WebSocket API 及代碼實現。


更多內容:http://www.ibm.com/developerworks/cn/java/j-lo-WebSocket/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章