comet http 長連接實現方式示例

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

基於長輪詢(long polling)的特點
1. 服務器端會阻塞請求直到有數據傳遞或超時才返回。

2. 客戶端響應處理函數會在處理完服務器返回的信息後,再次發出請求,重新建立連接。

3. 當客戶端處理接收的數據、重新建立連接時,服務器端可能有新的數據到達;這些信息會被服務器端保存直到客戶端重新建立連接,客戶端會一次把當前服務器端所有的信息取回。

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

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

基於iframe實現的例子可以參見這篇文章 [url=http://www.cnblogs.com/zhaozhan/archive/2010/09/07/1821021.html]利用Response.Flush和iframe實現”服務器推”技術[/url]
基於流(stream)
後臺服務器需要支持comet的web服務器,JAVA的話可以採用Jetty+tomcat 6.0以上的組合; 瀏覽器端依賴於Streaming AJAX 技術,目前Mozilla Firefox 提供了對這種技術的支持, 即當xmlhttprequest的返回值readystate 爲 3 時(數據仍在傳輸中),客戶端可以讀取數據,從而無須關閉連接,就能讀取處理服務器端返回的信息。IE 在 readystate 爲 3 時,不能讀取服務器返回的數據,目前 IE 不支持基於 Streaming AJAX。

基於流(stream)實現的例子可以參見這篇文章 [url=http://software.intel.com/zh-cn/articles/comet-java-realtime-system-essay/]淺析Comet技術在Java Web實時系統開發中的應用[/url]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章