初識Comet技術 1、服務器推送技術概述 服務器推送技術(Servers Push)的基礎思想是將瀏覽器主動查詢信息改成服務器主動發送信息。服務器發送一批數據,瀏覽器顯示這些數據,同時保證與服務器的鏈接。當服務器須要再次發送一批數據時,瀏覽器顯示數據並保持鏈接。之後,服務器仍然能夠發送批量數據,瀏覽器繼續顯示數據,依次類推 。主要應用於: 監控系統:報警提示; 即時通訊系統:其它用戶登陸、發送信息; 即時報價系統:後臺數據庫內容發生變化; 實現基於web的實時事件通知 。 實現方式有: 基於客戶端套接口 : 採用RMI、CORBA或者自定義TCP/IP信息的applet來實現 Comet: 基於 HTTP 長鏈接、無須在瀏覽器端安裝插件的技術 1.傳統輪詢javascript
在Web早期,這一點常使用meta刷新實現。這將自動指示瀏覽器在指定秒數以後從新裝載頁面,從而支持簡陋的輪詢(polling)。例如在HTML文件中加入<META HTTP-RQUIV="Refresh" CONTENT=12>,實際上就是HTTP頭標告知瀏覽器每12秒更新一次文檔。php
優勢:不須要服務器端的配置。 缺點:a) 糟糕的用戶體驗; b) 對服務器的壓力很大,而且形成帶寬的極大浪費。 2. Ajax輪詢html
Ajax隔一段時間(一般使用JavaScript的setTimeout函數)就去服務器查詢是否有改變,從而進行增量式的更新。可是間隔多長時間去查詢成了問題,由於性能和即時性形成了嚴重的反比關係。間隔過短,接二連三的請求會沖垮服務器,間隔太長,務器上的新數據就須要越多的時間才能到達客戶機。java
優勢:a) 不須要太多服務器端的配置。b) 下降帶寬的負荷(由於服務器返回的不是完整頁面)。 缺點:a) 對服務器的壓力並不會有明顯的減小。b) 實時性差,有必定的延遲。 應用:這是一項很是常見的技術,例如,大多數webmail應用程序就是經過這種技術在電子郵件到達時顯示電子郵件的。 2、Cometweb
Comet是一種用於web的推送技術,能使服務器能實時地將更新的信息傳送到客戶端,而無須客戶端發出請求, Comet 有時也稱反向Ajax或服務器端推技術(server-side push)。其思想很簡單:將數據直接從服務器推到瀏覽器,而沒必要等到瀏覽器請求數據。聽起來簡單,可是若是熟悉 Web 應用程序,尤爲是HTTP協議,那麼您就會知道,這毫不簡單。實現Comet風格的Web應用程序,同時保證在瀏覽器和服務器上的可伸縮性,這只是在最近幾年才成爲可能。目前一些主流網站都有相似的原理,例如:webQQ、開心網、校內等等,它們中消息動態都是採用相似的技術,只是具體實現方式不同。算法
COMET的精髓就在於用服務器與javascript來維持瀏覽器的長鏈接,同時完成服務器端事件的瀏覽器端響應。這樣的事件廣播機制是跨網絡的,同時也是實時的。數據庫
採用了Comet技術的服務器在客戶機作出一個請求後,和客戶機創建一個永久的鏈接,而後服務器會根據客戶機的請求不斷把數據包推向客戶,這個推的過程是不間斷的。由服務器推向客戶機的數據在客戶機的瀏覽器上會不斷產生新的內容,並且不會產生Client pull那樣的HTML文檔頭,從而大大減小了延遲的時間,向(服務器響應--客戶機請求)同步邁進了一步。編程
服務器推送一般效率要比客戶端拖曳效率高,由於它沒必要爲後續數據創建新的鏈接。因爲始終保持鏈接,即便沒有數據傳輸時也是這樣,所以服務器必須願意分配這些TCP/IP端口,對於TCP/IP端口數有限的服務器這將是一個嚴重的問題。瀏覽器
客戶端拖曳效率低,由於這必須每次爲傳送數據創建新的鏈接。可是它沒必要始終保持鏈接。在實際狀況中,創建HTTP鏈接一般須要花費至關多的時間,多達一秒甚至更多。所以從性能上考慮,服務器推送對於最終用戶更有吸引力,特別是對於須要常常更新信息的狀況下。服務器
服務器推送相對客戶端拖曳的另外一點優點是,服務器推送相對比較容易控制。例如,服務器每一次推送時都保持一個鏈接,但它又隨時能夠關閉其中的任何鏈接,而不須要在服務器上設置特殊的算法。而客戶端拖曳在一樣的狀況下要麻煩許多,它每次要與服務器創建鏈接,服務器爲了處理將客戶端拖曳請求與特定的最終用戶匹配等狀況,須要使用至關麻煩的算法。
如上所述,在服務器推送中,多個響應中鏈接始終保持,使服務器可在任什麼時候間發送更多的數據。一個明顯的好處是服務器徹底可以控制更新數據的時間和頻率。另外,這種方法效率高,由於始終保持鏈接。缺點是保持鏈接狀態會浪費服務器端的資源。服務器推送還比較容易中斷。
Comet目前有兩種實現方式,長輪詢和iframe流。 基於AJAX長輪詢(long-polling)——長輪詢是在打開一條鏈接之後保持,等待服務器推送來數據再關閉的方式。即服務端阻斷前一次對客戶端的迴應,在事件發生後將事件內容綁定在迴應中返回給客戶端,同時迴應結束,此時客戶端當即發送第二次請求,服務器阻塞回應等待下一次事件發生。 基於iframe及htmlfile流的方式——iframe流方式是在頁面中插入一個隱藏的iframe,利用其src屬性在服務器和客戶端之間創建一條長連接,服務器向iframe傳輸數據(一般是HTML,內有負責插入信息的javascript),來實時更新頁面。 iframe流方式的優勢是瀏覽器兼容好,Google公司在一些產品中使用了iframe流,如Google Talk。 優勢:實時性好(消息延時小);性能好(能支持大量用戶)
缺點:長期佔用鏈接,喪失了無狀態高併發的特色
一、基於AJAX輪詢方式與傳統AJAX方式的區別:
1). 服務器端會阻塞請求直到有數據傳遞或超時才返回。 2). 客戶端 JavaScript 響應處理函數會在處理完服務器返回的信息後,再次發出請求,從新創建鏈接。 3). 當客戶端處理接收的數據、從新創建鏈接時,服務器端可能有新的數據到達;這些信息會被服務器端保存直到客戶端從新創建鏈接,客戶端會一次把當前服務器端全部的信息取回。 採用這種方式實現的技術有meboo和pushlet chat。
二、基於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
三、Http長鏈接的編程原則
1)、不要在同一個客戶端開啓超過兩個的http長鏈接,這個是受http協議限制的。 2)、控制信息和數據信息使用不一樣的http鏈接。 3)、在客戶端和服務器端保持「心跳」信息。
四、Pushlet框架學習
Pushlet框架是用後臺採用java實現,前臺技術有AJAX和Iframe兩種。設計思想採用觀察者模式。
3、實現了comet的相關開源框架
pushlet——經過servlet(或者JSP)把JavaScript代碼做爲HTTP流推送到瀏覽器。這些代碼被瀏覽器的JavaScript引擎解釋並完成一些有趣的工做。因而便輕鬆地完成了從server端的Java到瀏覽器中的JavaScript的回調。 dwr cometD 4、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、Struts二、Ext JS都能整合。
參考:
http://zh.wikipedia.org/wiki/Comet_%28web%E6%8A%80%E6%9C%AF%29 Comet技術總結 WEB實時聊天 comet推技術 使用 Java 實現 Comet 風格的 Web 應用