WebSocket 是 HTML5 新增的協議,它的目的是在瀏覽器和伺服器之間建立一個不受限的雙向通信的通道,比如說,伺服器可以在任意時刻發送消息給瀏覽器。 為什麼傳統的 HTTP 協議不能做到 WebSocket 實現的功能?這是因為 HTTP 協議是一個請求-響應協議,請求必須先由瀏覽器發給服務 ...
WebSocket 是 HTML5 新增的協議,它的目的是在瀏覽器和伺服器之間建立一個不受限的雙向通信的通道,比如說,伺服器可以在任意時刻發送消息給瀏覽器。
為什麼傳統的 HTTP 協議不能做到 WebSocket 實現的功能?這是因為 HTTP 協議是一個請求-響應協議,請求必須先由瀏覽器發給伺服器,伺服器才能響應這個請求,再把數據發送給瀏覽器。換句話說,瀏覽器不主動請求,伺服器是沒法主動發數據給瀏覽器的。
也有人說,HTTP 協議其實也能實現啊,比如用輪詢或者 Comet。
輪詢是指瀏覽器通過 JavaScript 啟動一個定時器,然後以固定的間隔給伺服器發請求,詢問伺服器有沒有新消息。這個機制的缺點一是實時性不夠,二是頻繁的請求會給伺服器帶來極大的壓力。
Comet 本質上也是輪詢,但是在沒有消息的情況下,伺服器先拖一段時間,等到有消息了再回覆。這個機制暫時地解決了實時性問題,但是它帶來了新的問題:以多線程模式運行的伺服器會讓大部分線程大部分時間都處於掛起狀態,極大地浪費伺服器資源。另外,一個 HTTP 連接在長時間沒有數據傳輸的情況下,鏈路上的任何一個網關都可能關閉這個連接,而網關是我們不可控的,這就要求 Comet 連接必須定期發一些ping數據表示連接“正常工作”。
以上兩種機制都治標不治本,所以,HTML5 推出了 WebSocket 標準,讓瀏覽器和伺服器之間可以建立無限制的全雙工通信,任何一方都可以主動發消息給對方。
WebSocket 協議
WebSocket 是 HTML5 開始提供的一種在單個 TCP 連接上進行全雙工通訊的協議。
WebSocket 使得客戶端和伺服器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在 WebSocket API 中,瀏覽器和伺服器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,併進行雙向數據傳輸。
在 WebSocket API 中,瀏覽器和伺服器只需要做一個握手的動作,然後,瀏覽器和伺服器之間就形成了一條快速通道。兩者之間就直接可以數據互相傳送。
現在,很多網站為了實現推送技術,所用的技術都是 Ajax 輪詢。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對伺服器發出HTTP請求,然後由伺服器返回最新的數據給客戶端的瀏覽器。這種傳統的模式帶來很明顯的缺點,即瀏覽器需要不斷的向伺服器發出請求,然而HTTP請求可能包含較長的頭部,其中真正有效的數據可能只是很小的一部分,顯然這樣會浪費很多的帶寬等資源。
HTML5 定義的 WebSocket 協議,能更好的節省伺服器資源和帶寬,並且能夠更實時地進行通訊。
瀏覽器通過 JavaScript 向伺服器發出建立 WebSocket 連接的請求,連接建立以後,客戶端和伺服器端就可以通過 TCP 連接直接交換數據。
當你獲取 WebSocket 連接後,你可以通過 send() 方法來向伺服器發送數據,並通過 onmessage 事件來接收伺服器返回的數據。
另外,由於 WebSocke t是一個協議,伺服器具體怎麼實現,取決於所用編程語言和框架本身。Node.js 本身支持的協議包括 TCP 協議和 HTTP 協議,要支持 WebSocket 協議,需要對 Node.js 提供的 HTTPServer 做額外的開發。已經有若幹基於 Node.js 的穩定可靠的 WebSocket 實現,我們直接用 npm 安裝使用即可
總結:
WebSocket 是基於 TCP 的協議,WebSocket 只需要服務端和客戶端一次握手,就可以自由進行數據傳送和接收,允許服務端主動發送數據,不需要使用輪詢的方式。另外,WebSocket 客戶端基於事件的編程模型與 node 類似