在解釋 WebSocket 之前,先來看個需求。
在股票交易時間內,股票的價格變化十分迅速,股票網站需要向正在瀏覽頁面的使用者實時更新股價,這個需求裡的更新邏輯應該怎麼實現呢?
傳統的 HTTP 協定是無狀態的,每次發出請求時建立連線,收到回復時便斷開連線。如果使用 HTTP 協定來完成這個需求,則有兩種實現方式可以選擇:
1) 使用輪詢的方式
每隔幾秒就重新向伺服器傳送一個請求,查詢是否能獲取最新的資料。這樣做付岀的代價是,每次都要重新建立一次連線,建立連線就需要重新進行三次握手,傳送 Header 等冗餘資訊,很浪費資源。
2) 使用 HTTP 實現實時更新
通過 HTTP 實現實時更新的技術,就是 Comet,它的原理是傳送一個更新請求後,就一直佔據埠,等待伺服器響應,直到伺服器有資料返回時才會斷開連線。一個請求一直不斷開,也很浪費用戶端和伺服器的資源。
使用 WebSocket 可以很好地解決這個問題。WebSocket 是 HTML 5 的一個主要特性,它是建立在 TCP 上的一種全雙工協定,也就是說用戶端可以向伺服器發資訊,伺服器也可以向用戶端推播訊息。
WebSocket 在首次建立連線時,使用普通 HTTP 和伺服器通訊,同時告訴伺服器後面的互動用 WebSocket 的方式。
在 WebSocket 連線建立後,往來的訊息都可以通過這條管道傳送,同時用戶端與伺服器也會不斷地用 ping-pong 的方式保持心跳,防止連線異常斷開。
將更新邏輯從 HTTP 遷移到 WebSocket 是很簡單的,只需要實現 WebSocket 的幾個介面,就能在支援的瀏覽器上使用 WebSocket 的雙工特性。如果讀者想做一個實時性很強的網頁,或者想向網頁及時推播一些資訊,盡量選擇 WebSocket。