概述#
Long-Polling、WebSocket 和 Server-Sent Events(SSE)是用戶端(如網頁瀏覽器)與伺服器之間常用的通訊協定。
首先了解標準 HTTP 請求的流程:
- 用戶端開啟連線,向伺服器請求資料
- 伺服器計算回應
- 伺服器將回應送回用戶端

圖 11.1:HTTP 協定基本圖
Ajax Polling(輪詢)#
Polling 是大多數 AJAX 應用程式使用的標準技術。基本概念是用戶端反覆向伺服器請求資料,如果沒有可用資料,伺服器會回傳空回應。
流程如下:
- 用戶端透過一般 HTTP 開啟連線並請求資料
- 網頁以固定間隔(例如每 0.5 秒)向伺服器發送請求
- 伺服器計算回應並送回,與一般 HTTP 流量相同
- 用戶端重複以上步驟,定期取得伺服器的更新

圖 11.2:Ajax 輪詢協定圖
Polling 的問題在於用戶端必須不斷向伺服器詢問是否有新資料,導致大量回應是空的,造成不必要的 HTTP 開銷。
HTTP Long-Polling(長輪詢)#
Long-Polling 是傳統輪詢的變體,允許伺服器在資料可用時主動推送資訊給用戶端。用戶端的請求方式與一般輪詢相同,但預期伺服器不會立即回應,因此這種技術有時被稱為 Hanging GET。
- 如果伺服器沒有可用資料,不會送回空回應,而是保持請求並等待資料出現
- 一旦資料可用,伺服器送出完整回應,用戶端隨即重新發出請求,確保伺服器幾乎總是有一個等待中的請求可用於傳遞資料
生命週期#
- 用戶端透過一般 HTTP 發出初始請求並等待回應
- 伺服器延遲回應,直到有更新可用或逾時
- 當有更新時,伺服器送出完整回應
- 用戶端通常在收到回應後立即(或短暫延遲後)發送新的 Long-Poll 請求
- 每個 Long-Poll 請求都有逾時限制,連線關閉後用戶端需要定期重新連線
WebSocket#
WebSocket 透過單一 TCP 連線提供全雙工(Full Duplex)通訊通道,建立用戶端與伺服器之間的持久連線,雙方可以隨時開始傳送資料。

圖 11.3:WebSocket 協定圖
主要特點:
- 用戶端透過 WebSocket Handshake 建立連線
- 連線成功後,雙方可以隨時雙向傳輸資料
- 相比傳統 HTTP,WebSocket 的通訊開銷更低,有利於即時資料傳輸
- 伺服器可以主動推送內容到瀏覽器,不需要等待用戶端請求
- 訊息可以在保持連線的狀態下來回傳遞,實現雙向持續對話
Server-Sent Events(SSE)#
在 SSE 模式下,用戶端與伺服器建立一個持久且長期的連線,伺服器透過此連線向用戶端發送資料。如果用戶端需要向伺服器發送資料,則需要使用其他技術或協定。

圖 11.4:Server-Sent Events 協定圖
運作流程:
- 用戶端透過一般 HTTP 向伺服器請求資料
- 網頁與伺服器開啟一個連線
- 每當有新資訊時,伺服器主動將資料推送給用戶端
SSE 最適合用於需要從伺服器到用戶端的即時單向資料流的場景,或是伺服器在迴圈中產生資料並需要向用戶端發送多個事件的情境。