- 監控系統:報警提示;
- 即時通信系統:其它用戶登錄、發送信息;
- 即時報價系統:后台數據庫內容發生變化;
- 實現基於web的實時事件通知 。
- 基於客戶端套接口 : 采用RMI、CORBA或者自定義TCP/IP信息的applet來實現
- Comet: 基於 HTTP 長連接、無須在瀏覽器端安裝插件的技術
1.傳統輪詢
在Web早期,這一點常使用meta刷新實現。這將自動指示瀏覽器在指定秒數之后重新裝載頁面,從而支持簡陋的輪詢(polling)。例如在HTML文件中加入<META HTTP-RQUIV="Refresh" CONTENT=12>,實際上就是HTTP頭標告知瀏覽器每12秒更新一次文檔。
- 優點:不需要服務器端的配置。
- 缺點:a) 糟糕的用戶體驗; b) 對服務器的壓力很大,並且造成帶寬的極大浪費。
2. Ajax輪詢
Ajax隔一段時間(通常使用JavaScript的setTimeout函數)就去服務器查詢是否有改變,從而進行增量式的更新。但是間隔多長時間去查詢成了問題,因為性能和即時性造成了嚴重的反比關系。間隔太短,連續不斷的請求會沖垮服務器,間隔太長,務器上的新數據就需要越多的時間才能到達客戶機。
- 優點:a) 不需要太多服務器端的配置。b) 降低帶寬的負荷(因為服務器返回的不是完整頁面)。
- 缺點:a) 對服務器的壓力並不會有明顯的減少。b) 實時性差,有一定的延遲。
- 應用:這是一項非常常見的技術,例如,大多數webmail應用程序就是通過這種技術在電子郵件到達時顯示電子郵件的。
二、Comet
Comet 有時也稱反向Ajax或服務器端推技術(server-side push)。其思想很簡單:將數據直接從服務器推到瀏覽器,而不必等到瀏覽器請求數據。聽起來簡單,但是如果熟悉 Web 應用程序,尤其是HTTP協議,那么您就會知道,這絕不簡單。實現Comet風格的Web應用程序,同時保證在瀏覽器和服務器上的可伸縮性,這只是在最近幾年才成為可能。目前一些主流網站都有類似的原理,例如:webQQ、開心網、校內等等,它們中消息動態都是采用類似的技術,只是具體實現方式不一樣。
COMET的精髓就在於用服務器與javascript來維持瀏覽器的長連接,同時完成服務器端事件的瀏覽器端響應。這樣的事件廣播機制是跨網絡的,同時也是實時的。
采用了Comet技術的服務器在客戶機做出一個請求后,和客戶機建立一個永久的連接,然后服務器會根據客戶機的請求不斷把數據包推向客戶,這個推的過程是不間斷的。由服務器推向客戶機的數據在客戶機的瀏覽器上會不斷產生新的內容,而且不會產生Client pull那樣的HTML文檔頭,從而大大減少了延遲的時間,向(服務器響應--客戶機請求)同步邁進了一步。
服務器推送通常效率要比客戶端拖曳效率高,因為它不必為后續數據建立新的連接。由於始終保持連接,即使沒有數據傳輸時也是這樣,因此服務器必須願意分配這些TCP/IP端口,對於TCP/IP端口數有限的服務器這將是一個嚴重的問題。
客戶端拖曳效率低,因為這必須每次為傳送數據建立新的連接。但是它不必始終保持連接。在實際情況中,建立HTTP連接通常需要花費相當多的時間,多達一秒甚至更多。因此從性能上考慮,服務器推送對於最終用戶更有吸引力,特別是對於需要經常更新信息的情況下。
服務器推送相對客戶端拖曳的另一點優勢是,服務器推送相對比較容易控制。例如,服務器每一次推送時都保持一個連接,但它又隨時可以關閉其中的任何連接,而不需要在服務器上設置特殊的算法。而客戶端拖曳在同樣的情況下要麻煩許多,它每次要與服務器建立連接,服務器為了處理將客戶端拖曳請求與特定的最終用戶匹配等情況,需要使用相當麻煩的算法。
如上所述,在服務器推送中,多個響應中連接始終保持,使服務器可在任何時間發送更多的數據。一個明顯的好處是服務器完全能夠控制更新數據的時間和頻率。另外,這種方法效率高,因為始終保持連接。缺點是保持連接狀態會浪費服務器端的資源。服務器推送還比較容易中斷。
- 基於AJAX長輪詢(long-polling)——長輪詢是在打開一條連接以后保持,等待服務器推送來數據再關閉的方式。即服務端阻斷前一次對客戶端的回應,在事件發生后將事件內容綁定在回應中返回給客戶端,同時回應結束,此時客戶端立即發送第二次請求,服務器阻塞回應等待下一次事件發生。
- 基於iframe及htmlfile流的方式——iframe流方式是在頁面中插入一個隱藏的iframe,利用其src屬性在服務器和客戶端之間建立一條長鏈接,服務器向iframe傳輸數據(通常是HTML,內有負責插入信息的javascript),來實時更新頁面。 iframe流方式的優點是瀏覽器兼容好,Google公司在一些產品中使用了iframe流,如Google Talk。
-
優點:實時性好(消息延時小);性能好(能支持大量用戶)
缺點:長期占用連接,喪失了無狀態高並發的特點
1、基於AJAX輪詢方式與傳統AJAX方式的區別:
1). 服務器端會阻塞請求直到有數據傳遞或超時才返回。
2). 客戶端 JavaScript 響應處理函數會在處理完服務器返回的信息后,再次發出請求,重新建立連接。
3). 當客戶端處理接收的數據、重新建立連接時,服務器端可能有新的數據到達;這些信息會被服務器端保存直到客戶端重新建立連接,客戶端會一次把當前服務器端所有的信息取回。
采用這種方式實現的技術有meboo和pushlet chat。
2、基於iframe及htmlfile流的方式
這個方式和AJAX方式原理相同,只是瀏覽器一直會顯示正在連接狀態,gtalk采用htmlfile技術解決了此問題。Zeitoun 網站提供的 comet-iframe.tar.gz,封裝了一個基於 iframe 和 htmlfile 的 JavaScript comet 對象,支持 IE、Mozilla Firefox 瀏覽器,可以作為參考:http://www.zeitoun.net/articles/comet_and_php/start
3、Http長連接的編程原則
1)、不要在同一個客戶端開啟超過兩個的http長連接,這個是受http協議限制的。
2)、控制信息和數據信息使用不同的http連接。
3)、在客戶端和服務器端保持“心跳”信息。
4、Pushlet框架學習
Pushlet框架是用后台采用java實現,前台技術有AJAX和Iframe兩種。設計思想采用觀察者模式。
三、實現了comet的相關開源框架
- pushlet——通過servlet(或者JSP)把JavaScript代碼作為HTTP流推送到瀏覽器。這些代碼被瀏覽器的JavaScript引擎解釋並完成一些有趣的工作。於是便輕松地完成了從server端的Java到瀏覽器中的JavaScript的回調。
- dwr
- cometD
四、Comet實現(Java語言)
1 死循環法
最簡單的自然是死循環法,如果使用觀察者模式則可以進一步提高性能。
但是這種做法的缺點在於客戶端請求了這個servlet后,web服務器會開啟一個線程執行servlet的代碼,而servlet由遲遲不肯結束,造成該線程也無法被釋放。於是乎,一個客戶端一個線程,當客戶端數量增加時,服務器依然會承受很大的負擔。
2 改寫web服務器
目前的趨勢是從web服務器內部入手,用nio(JDK 1.4提出的java.nio包)改寫request/response的實現,再利用線程池增強服務器的資源利用率,從而解決這個問題,目前支持這一非J2EE官方技術的服務器有Glassfish和Jetty。
JDK 1.4版本(包括之后的版本)最顯著的新特性就是增加了NIO(New IO),能夠以非阻塞的方式處理網絡的請求,這就使得在Java中只需要少量的線程就能處理大量的並發請求了。
Jetty 6設計來處理大量並發連接,它使用Java語言的不堵塞I/O(java.nio)庫並且使用優化的輸出緩沖架構。Jetty也有一個處理長連接的殺手鐧:一個稱為Continuations的特性。
Grizzly作為GlassFish中非常重要的一個項目,就是用NIO的技術來實現應用服務器中的高性能純Java的HTTP引擎。Grizzly還是一個獨立於GlassFish的框架結構,可以單獨用來擴展和構建自己的服務器軟件。
特點:使用NIO不是一件簡單的技術,它的一些特點使得編程的模型比原來阻塞的方式更為復雜。
3 使用框架
基於Java的成熟的服務器推送框架有DWR。
DWR是一個開放源碼的使用Apache許可協議的解決方案,它包含服務器端Java庫、一個DWR servlet以及JavaScript庫。雖然DWR不是Java平台上唯一可用的 Ajax-RPC 工具包,但是它是最成熟的,而且提供了許多有用的功能。從最簡單的角度來說,DWR是一個引擎,可以把服務器端Java對象的方法公開給 JavaScript 代碼。使用 DWR 可以有效地從應用程序代碼中把Ajax的全部請求-響應循環消除掉。這意味着客戶端代碼再也不需要直接處理XMLHttpRequest對象或者服務器的響應。不再需要編寫對象的序列化代碼或者使用第三方工具才能把對象變成XML。甚至不再需要編寫servlet代碼把Ajax請求調整成對Java域對象的調用。
DWR從2.0開始增加了push功能,也就是在異步傳輸的情況下可以從Web-Server端發送數據到Browser。
特點:技術成熟,配置簡單,DWR與Spring、Struts2、Ext JS都能整合。
參考:
- http://zh.wikipedia.org/wiki/Comet_%28web%E6%8A%80%E6%9C%AF%29
- Comet技術總結
- WEB實時聊天 comet推技術
- 使用 Java 實現 Comet 風格的 Web 應用