傳統 HTTP 協議是「請求-響應」模型:客戶端發起請求,服務器被動響應。但在股票行情、即時通訊、協同編輯等場景,服務器掌握核心資源,需主動、實時向客戶端推送數據。
AJAX 處理了「局部刷新」與「異步請求」,但無法解決「服務器發起消息傳遞」。早期採用輪詢模擬實時性,卻帶來:
由此催生了 Comet(HTTP 長連接服務器推送) 技術,由 Dojo Toolkit 項目負責人 Alex Russell 命名。
機制:
特點:
瀏覽器差異:
readyState === 3(數據接收中)讀取響應 → Streaming AJAXreadyState === 4(完成)可讀取 → 僅支持長輪詢機制:
<iframe>,src 指向長連接端點<script>js_func("data")</script> 片段痛點:IE/Firefox 進度條持續轉動、顯示「載入中」
Google 破解方案:使用 ActiveX htmlfile 組件承載 iframe,解決 IE 顯示異常,應用於 Gmail/Gtalk。
| 維度 | 長輪詢 | Iframe 流 |
|---|---|---|
| 實現基礎 | XMLHttpRequest | iframe + script 標籤 |
| 連接模式 | 請求-阻塞-響應-關閉-重連 | 持久連接,持續輸出腳本 |
| 瀏覽器兼容 | 優(全支持 AJAX 即可) | 需 htmlfile 修復 IE |
| 服務端壓力 | 中(頻繁握手) | 高(長連接佔用連接數) |
| 典型框架 | Pushlet、CometD | Zeitoun comet-iframe |
隨著 WebSocket(全雙工、單連接、低延遲)與 Server-Sent Events (SSE)(單向推送、自動重連、HTTP/2 多路複用)的普及,Comet 逐漸退出主流舞台。但理解其原理,有助於掌握「長連接」「狀態保持」「瀏覽器兼容」等核心網絡編程概念。