基於 WEB 的實時事件通知方式大致有五種方案HTTP拉取方式(pull)HTTP流Long PollingFlash XMLSocket方式Java Applet
首先說下Comet這個詞Comet 這個詞是最早由Alex Russell(Dojo Toolkit 的項目 Lead)提出的稱基於 HTTP 長連接無須在浏覽器端安裝插件的服務器推(Push)技術為Comet
一HTTP拉取方式(pull)
在這種傳統的方法中客戶端以用戶可定義的時間間隔去檢查服務器上的最新數據這種拉取方式的頻率要足夠高才能保證很高的數據精確度但高頻率可能會導致多余的檢查從而導致較高的網絡流量而另一方面低頻率則會導致錯過更新的數據理想地拉取的時間間隔應該等於服務器狀態改變的速度常見的實現如利用 <meta httpequiv=refresh content= /> tag當然利用xmlHttpRequest定時取也是一種方法
二HTTP流(Push機制)
HTTP流有兩種形式* Page Stream 頁面上不間斷的HTTP連接響應(HTTP Keep Alive)
通過在 HTML 頁面裡嵌入一個隱蔵幀(iframe)然後將這個隱蔵幀的 SRC 屬性設為對一個長連接的請求服務器端就能源源不斷地往客戶端輸入數據
* Service Stream XMLHttpRequest連接中的服務器數據流
客戶端是在 XMLHttpRequest 的 readystate 為 (即數據傳輸結束)時調用回調函數進行信息處理當 readystate 為 時數據傳輸結束連接已經關閉Mozilla Firefox 提供了對 Streaming AJAX 的支持即 readystate 為 時(數據仍在傳輸中)客戶端可以讀取數據從而無須關閉連接就能讀取處理服務器端返回的信息IE 在 readystate 為 時不能讀取服務器返回的數據目前 IE 不支持基於 Streaming AJAX
注使用 Page Stream(iframe) 請求一個長連接有一個很明顯的不足之處IEMorzilla Firefox 下端的進度欄都會顯示加載沒有完成而且 IE 上方的圖標會不停的轉動表示加載正在進行Google 的天才們使用一個稱為htmlfile的 ActiveX 解決了在 IE 中的加載顯示問題並將這種方法用到了 gmail+gtalk 產品中Alex Russell 在 What else is burried down in the depths of Googles amazing JavaScript?文章中介紹了這種方法Zeitoun 網站提供的 cometiframetargz封裝了一個基於 iframe 和 htmlfile 的 JavaScript comet 對象支持 IEMozilla Firefox 浏覽器可以作為參考(?p=)
三長時間輪詢(Long Polling)
也就是所謂的異步輪詢(Asynchronous Polling)這種方式是純服務器端推送方式和客戶端拉取方式的混合它是基於BAYEUX協議()的這個協議遵循基於主題的發布——訂閱機制在訂閱了某個頻道後客戶端和服務器間的連接會保持打開狀態並保持一段事先定義好的時間(默認為秒)如果服務器端沒有事件發生而發生了超時服務器端就會請求客戶端進行異步重新連接如果有事件發生服務器端會發送數據到客戶端然後客戶端重新連接
服務器端會阻塞請求直到有數據傳遞或超時才返回
客戶端 JavaScript 響應處理函數會在處理完服務器返回的信息後再次發出請求重新建立連接
當客戶端處理接收的數據重新建立連接時服務器端可能有新的數據到達這些信息會被服務器端保存直到客戶端重新建立連接客戶端會一次把當前服務器端所有的信息取回
Flash XMLSocket(push機制)
From:http://tw.wingwit.com/Article/program/net/201311/13515.html