天天看點

Comet: HTTP長連接配接

基于 HTTP 長連接配接、無須在浏覽器端安裝插件的“伺服器推”技術為“Comet”。

前提: http 1.1 + 基于目前web server的更改/額外的子產品(插件)

概念

     關于comet的最初定義來自這篇blog文章:http://alex.dojotoolkit.org/?p=545。

     簡單的說就是用戶端發送一個請求,伺服器接收它,并使用一個無限循環,将用戶端需要的資料push到response中,并進行重新整理,但是該response并不關閉,繼續接收新的資料并重新整理,直到用戶端斷開連接配接,該循環才結束退出。

     我們可以認為ajax解決了單使用者響應的問題,而comet則解決了在保證性能的前提下進行協同多使用者的響應問題。

     comet的優點在于它可以在任何時候向用戶端發送資料,而不僅僅隻是響應使用者的輸入請求。而發送資料是在一個已有的單連接配接上進行的。是以可以大大降低發送資料的延遲時間(建立connection的開銷,以及用戶端發送請求的等待時間)。

關于Event Web Server

     comet技術的一個重要組成部分就是event-drived web server,目前商用的實作已經出現,如lightstreamer(http://www.lightstreamer.com),這個我沒有仔細看,隻是跑了一下他給出的demo,還行!開源的實作就是apache+jetty(還要加一個mod)這個我還沒有具體用過!

     有國人聲稱實作了comet server(http://cnc.agile.com/read.php?tid=319),還沒去仔細研究,不知道如何。

      pushlet目前使用的是client pull做法,當然它的server push也将在不久的将來實作,它沒有聲稱隻能在專用的event-drived web server上運作,目前在tomcat運作環境下是可以的,不知道最多能承受多少使用者同時通路還有待考證!

comet新體驗

      我看了一下comet技術的一些實作,其中meebo(http://wwwm.meebo.com/)算是做的比較好的一個(gmail有誰用過?說說感受),我覺得它的web版本msn messager,比微軟自己的web msn就要好用的多。

基于http的聊天類應用,自始自終都隻有兩類做法(如果有其他類别,請指正我),

1.client pull。用JS等定時去伺服器取資料。

  好處是保持了http server的無狀态高并發,壞處是大量的pull動作其實是白費的。

2.server push。服務端的JSP等程式的響應永不關閉,定時輸出新内容。

  好處是有新内容才輸出,比較節省帶寬等資源,壞處是長期占用了連接配接,喪失了無狀态高并發的特點。

連接配接時有狀态長期保持還是相反,這個也是傳統意義上C/S與B/S的一大差別。是以看上去C/S會比B/S的并發負載能力低。但C/S的響應會更靈活和快速。

server push通過維持長連接配接來得到快速将資料push到所有已連接配接的用戶端,正因為如此是以不能采用傳統的http web server,必須使用專用的event-drived web server來解決keep-alived connection的問題。

是以comet也沒有什麼新技術,一個成熟的comet應用除了需要一定的用戶端腳本和伺服器端代碼的支援還需要特定的web server的支援!而一個成熟的comet framework則需要對這些用戶端腳本和伺服器代碼進行良好的封裝并能與各種event-drived web server能進行很好的結合,目前還沒有比較成熟的event-drived web server出現,是以comet應用也沒有象ajax那樣普及。

與ajax應用相比,comet技術主要适用于即時通訊,實時資料監控,多使用者協同互動的系統,是以comet應該算是ajax的一個有力補充和延伸!      

請求得不到伺服器的response 是以連接配接時一直保持的 除非逾時。

comet(http 請求長連接配接) 之 ajax 長查詢 簡單實作

http://www.cnblogs.com/leon_yang/archive/2009/10/10/1580247.html

HTTP長連接配接伺服器端推技術

http://blog.csdn.net/starxu85/archive/2008/11/23/3356907.aspx

Comet:基于 HTTP 長連接配接的“伺服器推”技術

http://www.cnblogs.com/happyday56/archive/2009/06/10/1500427.html

http://www.ibm.com/developerworks/cn/web/wa-lo-comet/

Nginx加Comet:低延遲的伺服器端推送

http://www.jifuyi.com/nginx-and-comet-low-latency-server-push/

http://www.blogjava.net/rosen/archive/2009/02/11/254309.html

如何在 Tomcat 6 中實作異步 Servlet

http://tomcat.apache.org/tomcat-6.0-doc/aio.html

淺談comet技術

http://hi.baidu.com/zjugis/blog/item/cbaaaa642e65d9f8f736541d.html

Comet登 場,簡單說還是利用Ajax與伺服器建立http長連接配接查詢是否有資料更新,伺服器收到一個連接配接如果沒有資料更新就阻塞這個連接配接不要傳回給用戶端,直到有 新資料再傳回給用戶端。Web用戶端,發起的連接配接一旦被傳回,或者逾時就再次建立http長連接配接。這樣就能保證資料的即時更新,以及盡量減少伺服器的計算 工作。 2. Comet的一些應用

目前Comet主要應用在一些股票web用戶端,以及一些基于web的即時聊天系統中。

比較成熟的架構有Dojo ,Dwr 等一些Ajax架構中實作了該功能。

3. Comet 優、 缺點

3.1 缺點  

長期占用連接配接,喪失了無狀态高并發的特點。

server push不會是一個沒有副作用的解決方案,是否适合還要仔細權衡。

3.2 優點  

Ø 實時性好(消息延時小)

Ø 性能好(能支援大量使用者)

4.其他伺服器推技術

Comet 隻是衆多伺服器推技術中的一種,目前市面上還有許多其他流行伺服器推技術。

4.1 Flash XMLSocket

這種方案實作的基礎是:

1. Flash 提供了 XMLSocket 類。

2. JavaScript 和 Flash 的緊密結合:在 JavaScript 可以直接調用 Flash 程式提供的接口。

但此方案的缺點在于:

1. 因為 XMLSocket 沒有 HTTP 隧道功能,XMLSocket 類不能自動穿過防火牆;

2. 因為是使用套接口,需要設定一個通信端口,防火牆、代理伺服器也可能對非 HTTP 通道端口進行限制;

不過這種方案在一些網絡聊天室,網絡互動遊戲中已得到廣泛使 用 。

4.2 Java Applet 套接口

在用戶端使用 Java Applet,通過 java.net.Socket 或 java.net.DatagramSocket 或 java.net.MulticastSocket 建立與伺服器端的套接口連接配接,進而實作“伺服器推”。

這種方案最大的不足在于 Java applet 需要用戶端安裝JAVA虛拟機 。

繼續閱讀