概述#

Long-Polling、WebSocket 和 Server-Sent Events(SSE)是用戶端(如網頁瀏覽器)與伺服器之間常用的通訊協定。

首先了解標準 HTTP 請求的流程:

  1. 用戶端開啟連線,向伺服器請求資料
  2. 伺服器計算回應
  3. 伺服器將回應送回用戶端

圖 11.1:HTTP 協定基本圖

Ajax Polling(輪詢)#

Polling 是大多數 AJAX 應用程式使用的標準技術。基本概念是用戶端反覆向伺服器請求資料,如果沒有可用資料,伺服器會回傳空回應。

流程如下:

  1. 用戶端透過一般 HTTP 開啟連線並請求資料
  2. 網頁以固定間隔(例如每 0.5 秒)向伺服器發送請求
  3. 伺服器計算回應並送回,與一般 HTTP 流量相同
  4. 用戶端重複以上步驟,定期取得伺服器的更新

圖 11.2:Ajax 輪詢協定圖

Polling 的問題在於用戶端必須不斷向伺服器詢問是否有新資料,導致大量回應是空的,造成不必要的 HTTP 開銷。

HTTP Long-Polling(長輪詢)#

Long-Polling 是傳統輪詢的變體,允許伺服器在資料可用時主動推送資訊給用戶端。用戶端的請求方式與一般輪詢相同,但預期伺服器不會立即回應,因此這種技術有時被稱為 Hanging GET

  • 如果伺服器沒有可用資料,不會送回空回應,而是保持請求並等待資料出現
  • 一旦資料可用,伺服器送出完整回應,用戶端隨即重新發出請求,確保伺服器幾乎總是有一個等待中的請求可用於傳遞資料

生命週期#

  1. 用戶端透過一般 HTTP 發出初始請求並等待回應
  2. 伺服器延遲回應,直到有更新可用或逾時
  3. 當有更新時,伺服器送出完整回應
  4. 用戶端通常在收到回應後立即(或短暫延遲後)發送新的 Long-Poll 請求
  5. 每個 Long-Poll 請求都有逾時限制,連線關閉後用戶端需要定期重新連線

WebSocket#

WebSocket 透過單一 TCP 連線提供全雙工(Full Duplex)通訊通道,建立用戶端與伺服器之間的持久連線,雙方可以隨時開始傳送資料。

圖 11.3:WebSocket 協定圖

主要特點:

  • 用戶端透過 WebSocket Handshake 建立連線
  • 連線成功後,雙方可以隨時雙向傳輸資料
  • 相比傳統 HTTP,WebSocket 的通訊開銷更低,有利於即時資料傳輸
  • 伺服器可以主動推送內容到瀏覽器,不需要等待用戶端請求
  • 訊息可以在保持連線的狀態下來回傳遞,實現雙向持續對話

Server-Sent Events(SSE)#

在 SSE 模式下,用戶端與伺服器建立一個持久且長期的連線,伺服器透過此連線向用戶端發送資料。如果用戶端需要向伺服器發送資料,則需要使用其他技術或協定。

圖 11.4:Server-Sent Events 協定圖

運作流程:

  1. 用戶端透過一般 HTTP 向伺服器請求資料
  2. 網頁與伺服器開啟一個連線
  3. 每當有新資訊時,伺服器主動將資料推送給用戶端

SSE 最適合用於需要從伺服器到用戶端的即時單向資料流的場景,或是伺服器在迴圈中產生資料並需要向用戶端發送多個事件的情境。