HTTP長連接(Comet)實現方式示例


昨天看了comet的介紹后,雖然大概知道了comet的原理,不過沒實際用過還是不太清楚,於是今天又在網上翻了一下別的網友共享的comet實現http長連接的例子,在 Comet Server Push 技術介紹 一文中分別提到了 ”基於長輪詢(long polling)“、”基於iframe“、”基於流(stream)“三種實現comet的方式,下面我將網上找到的對應的例子鏈接做個匯總,就當目錄吧,留作以后看 

 基於長輪詢(long polling)的特點 
1. 服務器端會阻塞請求直到有數據傳遞或超時才返回。 
2. 客戶端響應處理函數會在處理完服務器返回的信息后,再次發出請求,重新建立連接。 
3. 當客戶端處理接收的數據、重新建立連接時,服務器端可能有新的數據到達;這些信息會被服務器端保存直到客戶端重新建立連接,客戶端會一次把當前服務器端所有的信息取回。 

基於長輪詢的實現方式的例子可以參見這篇文章 Ajax輪詢以及Comet模式—寫在Servlet 3.0發布之前 
 不過個人感覺作者在寫服務器端的示例代碼時沒有體現出 "服務器端會阻塞請求直到有數據傳遞或超時才返回",正確的做法應該是一個servlet接收聊天信息,一個servlet響應輪詢請求,采用觀察者模 式,被觀察者的狀態變化是查看聊天信息是否有更改,觀察者會保存每個瀏覽器的輪詢請求的response對象,當被觀察者接收到新的聊天信息時,會通知觀 察者,觀察者則會將當前最新的聊天內容返回給瀏覽器。也就是說只有當接收聊天信息的servlet接收到新的聊天內容時,被觀察者才會通知所有的觀察者, 否則觀察者將會一直保持response對象,沒有返回,這樣對瀏覽器來說就是一種阻塞。有時間自己再寫一個例子驗證一下... 

基於iframe 
通過在 HTML 頁面里嵌入一個隱蔵幀,然后將這個隱蔵幀的 SRC 屬性設為對一個長連接的請求,服務器端就能源源不斷地往客戶端輸入數據。這種方式的難點在於如何判斷連接中斷並重新嘗試連接。


基於iframe實現的例子可以參見這篇文章  利用Response.Flush和iframe實現”服務器推”技術


基於流(stream) 
后台服務器需要支持comet的web服務器,JAVA的話可以采用Jetty+tomcat 6.0以上的組合; 瀏覽器端依賴於Streaming AJAX 技術,目前Mozilla Firefox 提供了對這種技術的支持, 即當xmlhttprequest的返回值readystate 為 3 時(數據仍在傳輸中),客戶端可以讀取數據,從而無須關閉連接,就能讀取處理服務器端返回的信息。IE 在 readystate 為 3 時,不能讀取服務器返回的數據,目前 IE 不支持基於 Streaming AJAX。


基於流(stream)實現的例子可以參見這篇文章  淺析Comet技術在Java Web實時系統開發中的應用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM