999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

淺析Comet技術在Java Web實時系統開發中的應用

2010-01-01 00:00:00錢宇虹
軟件工程 2010年4期

摘要:Comet技術通過實現服務器推(server push)來解決AJAX需要定時頻繁發送請求的問題,從而給Web實時系統帶來了全新的交互性。本文分析了Comet技術的兩種實現方式:長輪詢方式(long-polling)和流方式(streaming),并通過一個服務器推送隨即數的實例,展示了使用Comet技術開發Java Web實時系統的開發方法和步驟。

關鍵詞:Comet;AJAX;服務器推送;Web實時系統

HTTP協議是互聯網上大量信息交換的基礎,其特點是,它是基于請求—響應模式的無狀態的單向協議,即必須由客戶端發起一個請求建立連接,服務器接收請求,把數據返回給客戶端,然后釋放連接。下一次,再由客戶端發起另一次請求,重復上述過程。服務器始終處于“被動”地位。

HTTP協議這一特點,既成就了它的成功,也導致了它的局限性。服務器處理請求的經典模式是一個線程處理一個連接,結束之后,關閉該連接,釋放線程以服務于其他請求。只要響應速度足夠快,那么我們可以以相對較少的服務器為數量龐大的用戶提供服務。這非常適合于傳統的Web應用,比如:搜索引擎、內容管理系統和電子商務網站等。然而,這種方式并不能滿足有實時性要求的應用的需求,很多應用都需要服務器能實時地將更新的信息傳送到客戶端,而無須客戶端發出請求。例如,新聞標題、證券報價和拍賣行情等。

在Web的早期,人們通過在HTML頭部加入META元信息來實現HTML自動刷新。該標記指示瀏覽器每隔一定的時間間隔刷新一次頁面。這不僅帶來糟糕的用戶體驗,而且是一種低效的做事方式。因為如果沒有新的數據,該頁面就沒必要刷新;如果頁面只存在小范圍內的變化,該頁面就沒有必要全部刷新。

AJAX(Asynchronous JavaScript and XML,異步JavaScript和XML)的出現改變了上述情況。Ajax的工作原理相當于在客戶和服務器之間加了—個中間層,使客戶請求與服務器響應異步化。并不是所有的請求都提交給服務器,像—些數據驗證和數據處理等都交給AJAX引擎自己來做,只有確定需要從服務器讀取新數據時再由AJAX引擎代為向服務器提交請求。使用Ajax的最大優點就是能在不刷新整個頁面的前提下維護數據,使得Web應用程序更為迅捷地響應用戶交互,并避免了在網絡上發送那些沒有改變的信息。然而,AJAX仍然受限于Web請求/響應模式的弱點,使得服務器不能推送實時動態的Web數據。

1 Comet技術實現方式[1]

Comet技術被稱為反AJAX(Reverse AJAX)技術,它通過實現服務器推(server push)來解決AJAX需要定時頻繁發送請求的問題。通過Comet,客戶端所需要的響應信息不再需要主動地去索取,而是在服務器端以事件(Event)的形式推至客戶端。

Comet技術的實現方式有兩種:長輪詢方式(long-polling)和流方式(streaming)。

長輪詢:HTTP的連接保持,服務器端會阻塞請求,直到服務器端有一個事件觸發或者到達超時??蛻舳嗽谑盏巾憫笤俅伟l出請求,重新建立連接。通過這種方式,服務器可以在數據可用的任何時候將數據“推”到客戶端。因為這種方案基于AJAX,請求異步發出,無須安裝插件,IE、Mozilla FireFox都支持。

流方式:在流方式中,服務器推數據返回客戶端,但不關閉連接,連接始終保持,直到超時,超時后通知客戶端重新建立連接,并關閉原來的連接。

在長輪詢方式下,客戶端是在XMLHttpRequest的readystate為4(即數據傳輸結束)時調用回調函數,進行信息處理。當readystate為4時,數據傳輸結束,連接已經關閉。Mozilla Firefox提供了對流方式的支持,即readystate為3時(數據仍在傳輸中),客戶端可以讀取數據,從而無須關閉連接,就能讀取處理服務器端返回的信息。IE在readystate為3時,不能讀取服務器返回的數據,目前IE不支持流方式。

不管是長輪詢還是流,請求都需要在服務器上存在一段較長時間,因此Comet被稱為“基于HTTP長連接的服務器推技術”。這打破了每個請求一個線程的模型。這個模型顯然對Comet不適用。Java對此提出了非阻塞IO(non-blocking IO)解決方案,Java通過它的NIO庫提供非阻塞IO處理Comet。

傳統的阻塞式IO,每個連接必須要開一個線程來處理,您始終從一個線程中讀取流直到整個流完成,然后關閉連接。因此阻塞式IO對大量并發的短生命周期連接不會造成問題。而非阻塞IO處理連接是異步的。當某個連接發送請求到服務器,服務器把這個連接請求當作一個請求“事件”,并把這個“事件”分配給相應的函數處理。我們把這個處理函數放到線程中去執行,執行完就把線程歸還。這樣一個線程就可以異步地處理多個事件。

為了獲得事件通知,我們需要一個機制,它只在需要讀時才讀,需要寫時才寫,但又保持連接打開以迅速響應發生的事件。為了方便這個過程,就要用到NIO,它已是1.4版本以后的Java語言的一部分。

2 使用Java開發Comet風格的Web應用

支持Comet的Java Web開源服務器有Tomcat 6.0.14和Jetty 6.1.14,它們的實現方法各不相同。下面我們以Tomcat為例來說明開發Comet風格的Web應用的步驟[2]。

本例以流方式實現了一個Comet應用。服務器每隔一定的時間間隔產生一個0~9之間的隨機數,將數據推送到客戶端。客戶端接收并顯示。

第一,要下載和安裝Tomcat6.X(本文截稿時,Tomcat最新版本是6.0.24)。

第二,為了使用Comet,要求服務器支持NIO,所以要修改Tomcat配置文件conf/server.xml, 即啟用異步版本的IO連接器,這個非常關鍵。如下所示:

第三,該項目需要Comet的API支持,Tomcat6自帶的Comet API包為catalina.jar,在Tomcat安裝目錄下的lib目錄中。

第四,編寫Servlet。通過servlet實現CometProcessor接口。這個接口要求實現event()方法,在配置的Http11NioProtocol調用event()方法來處理請求,而不是doGet或doPost。最基本的支持Comet的servlet實現如程序清單1所示。

在event()方法中,分別處理連接開始(BEGIN)、新數據可用(READ),連接結束(END),或出錯等事件。Comet允許針對不同的事件指定不同的連接超時。這意味著可以給常規的請求設置很短的生命周期,但是對于響應長連接請求的機制,可以將這個生命周期延長至幾分鐘。

TestComet Servlet中,在連接開始時首先設置連接超時為60秒,接著啟動一個推送數據的線程。該線程的實現類為RandomSender,如程序清單2所示。請注意,這個類含有一個 ServletResponse對象?;仡^看看清單1中的event()方法,當事件為BEGIN時,response對象被傳入到 RandomSender中。RandomSender的run()使用ServletResponse將數據發送回客戶機。因為要實現流風格的Comet,所以不能關閉連接。而要使連接保持開啟。如果要實現長輪詢,則一旦發送完所有消息后,就要關閉連接。

第五,編寫客戶端。在客戶端,發出AJAX請求。請求和常規請求差不多。程序清單3測試了最基本的AJAX請求,它基于XMLHttpRequest,能夠很好地響應來自Comet服務器的事件??蛻舳嗽趓eadystate為3時(數據仍在傳輸中)讀取數據,從而無須關閉連接,就能讀取處理服務器端返回的數據,將它顯示在瀏覽器上。

第六,運行程序。首先進行部署,為了使程序正常運行,先要刪除本應用的lib目錄下的catalina.jar,如果不這么做,會出現異常:java.lang.ClassCastException: org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.apache.AnnotationProcessor。

最后,重啟Tomcat6,用FireFox瀏覽器調用主頁面index.jsp,就可以看到隨機數不斷地涌現。

3 結束語

采用Comet技術實現的Java Web實時系統帶來了全新的交互性,目前Java Web服務器正在為實現Comet提供成熟、穩定的技術,不久的將來,Comet將成為Servlet 3.0和JavaEE6的標準的一部分。

參考文獻

[1] GALPIN M. Developing with Comet and Java [EB/OL].(2009-05-26)[2009-08-18].http://www.ibm.com/developerworks/web/library/wa-cometjava/index.html.

[2] Apache Software Foundation. Advanced IO and Tomcat [EB/OL]. [2009-09-05].http://tomcat.apache.org/tomcat-6.0-doc/aio.html.

主站蜘蛛池模板: 日本高清免费不卡视频| 就去色综合| 亚洲不卡网| 国产一区二区色淫影院| 久久亚洲精少妇毛片午夜无码 | 99免费视频观看| 一级毛片基地| 国产91久久久久久| 麻豆AV网站免费进入| 国内精自线i品一区202| 日韩激情成人| 2048国产精品原创综合在线| 欧美在线天堂| 亚洲一区二区三区国产精华液| 久久国产亚洲偷自| 看你懂的巨臀中文字幕一区二区| 97久久人人超碰国产精品| 亚洲无线视频| 91精品日韩人妻无码久久| 亚洲日韩高清在线亚洲专区| 日韩午夜片| 亚洲av无码人妻| 亚洲国产成人久久精品软件| 国产剧情一区二区| 亚洲va在线∨a天堂va欧美va| 欧美国产日韩一区二区三区精品影视| 国内黄色精品| vvvv98国产成人综合青青| 久久不卡国产精品无码| 亚洲91精品视频| 亚洲三级影院| 天堂va亚洲va欧美va国产 | 国产精品30p| 欧美特黄一免在线观看| 欧美专区日韩专区| 国产91色| 午夜电影在线观看国产1区| 亚洲人成网7777777国产| 国产成人av一区二区三区| 国产在线97| 亚洲AⅤ综合在线欧美一区| 亚洲高清日韩heyzo| 国产 在线视频无码| 91精品国产91久无码网站| 思思热在线视频精品| 国产精品女主播| 天堂岛国av无码免费无禁网站| 国产福利在线观看精品| 国产亚洲男人的天堂在线观看| 无码免费试看| 广东一级毛片| 在线国产毛片手机小视频| 国产毛片高清一级国语| 天天躁夜夜躁狠狠躁躁88| 免费毛片a| 欧美日韩中文国产| 亚洲一区二区三区在线视频| 亚洲欧美日韩综合二区三区| 激情无码视频在线看| 青青操国产视频| 色综合日本| 亚洲伦理一区二区| 亚洲中文字幕日产无码2021| 国模极品一区二区三区| 国产精品成人免费视频99| 国产本道久久一区二区三区| 91精品啪在线观看国产60岁 | 91视频免费观看网站| 再看日本中文字幕在线观看| 亚洲欧美一区二区三区蜜芽| 国产亚洲视频中文字幕视频| 91精品国产自产在线观看| 亚洲一区二区三区国产精品| 欧美国产成人在线| 91精品伊人久久大香线蕉| a国产精品| 日韩欧美中文在线| 黄色网在线免费观看| 国产午夜精品一区二区三| 超薄丝袜足j国产在线视频| 日韩欧美高清视频| 国产农村1级毛片|