余勇
(河南經貿職業(yè)學院,河南鄭州450053)
WEB應用程序工作的基礎協議——HTTP協議是一個無狀態(tài)、單向的協議,當客戶端向服務器發(fā)送一個請求時,服務器就會處理這個請求,并發(fā)送數據給該客戶端,從而完成對該請求的響應,緊接著服務器處理下一個請求,這個過程可以總結為“請求—應答模式”。由于是無狀態(tài)的,并且在“請求—應答模式”這種單向模式下工作,因此,HTTP協議能夠快速地為請求提供服務,每秒鐘可以處理大量的請求,只需使用少量的服務器就可以為大量用戶服務,因此,HTTP協議在當前的WEB開發(fā)中得到了廣泛的應用。但是,“請求—應答模式”也有其局限性,那就是請求必須由客戶端發(fā)出,而服務器則只能在對請求的響應中向客戶端發(fā)送數據。這個局限性會影響很多類型WEB應用程序的實用性,如:基于WEB的聊天程序、即時通信系統(tǒng)、股票實時行情系統(tǒng)等。而Comet技術則可以較好地解決這個問題。
Comet技術被稱為服務器“推”技術,它可以將服務器端的數據主動“推”送到客戶端,當服務器端有新的數據時,Comet技術就可以將最新的信息“推”送到客戶端,從而使客戶端及時獲得最新數據。當前,Comet這種服務器“推”技術多數是基于AJAX技術的,并有多種實現形式,如:輪詢方式、長輪詢方式、基于Iframe的流(stream ing)方式、基于客戶端插件套接口的Comet技術等。
Comet依托AJAX技術才得以更好地實現。AJAX的全稱是異步JavaScript和XML(Asynchronous javascript and xml),其基本功能就是實現WEB頁面與服務器端的無刷新交互。
AJAX技術是JavaScript技術與XML技術的綜合應用,AJAX技術的基本原理就是通過建立XmlHttpRequest對象來向服務器發(fā)送異步請求,并從服務器獲得數據,然后用JavaScript來操作DOM對象來更新頁面,從而實現在不刷新頁面的情況下將WEB服務器上已經改變的內容顯示到WEB頁面上,從而增強用戶體驗。本系統(tǒng)正是利用AJAX技術的這一特點。
Comet技術的主要實現形式有輪詢方式、長輪詢方式、基于Iframe的流(streaming)方式、基于客戶端插件套接口的Comet技術等,各種實現方式的特點如下:
(1)輪詢方式,在這種方式下使用AJAX技術向服務器發(fā)出調用請求,返回后等待一段固定的時間,然后再次請求,這樣,服務器上的數據就會不斷被“請求”到客戶端,從而實現服務器數據即時更新到客戶端的目的。輪詢方式其實并不算真正意義上的實時,因為最新數據到達客戶端的時間還取決于所等待的一段固定時間的長短。如果將等待的固定時間變得接近于零,那么客戶端不斷的請求則會對服務器造成很大的壓力,這也是輪詢方式的缺點。
(2)長輪詢方式,與輪詢方式類似,長輪詢方式將請求保持更長時間,直到服務器有新數據或者超時,服務器將數據發(fā)送到客戶端,并結束本次請求,從而開始下一次請求。長輪詢方式的缺點就是要將請求一直保持,這也會影響服務器所能服務的客戶端的數量。
(3)基于Iframe的流(stream ing)方式,這種方式通過在頁面里嵌入一個Iframe隱蔵域,然后將這個隱蔵域的src屬性設為一個長連接的請求頁面,服務器端就能借助這個隱藏域不斷地向客戶端輸出數據,客戶端接收到數據后,通過JavaScript及AJAX技術將數據顯示到頁面上,從而實現服務器數據即時顯示到客戶端的目的?;贗frame的流(stream ing)方式與長輪詢方式類似,也需要將請求一直保持,同樣影響服務器所能服務的客戶端的數量。
(4)基于客戶端插件套接口的Comet技術,如:Flash XMLSocket、Java小程序(Applet)等,這種方式需要客戶端安裝相應的插件,因此其局限性較強,只在一些特定系統(tǒng)及游戲中應用。
通過比較Comet技術的這幾種實現形式,我認為長輪詢方式在實現基于WEB的即時通信系統(tǒng)時最為適合。我們可以將基于Comet技術的WEB即時通信系統(tǒng)分為兩個層次:業(yè)務邏輯層和表現層。業(yè)務邏輯層主要實現消息的封裝及消息的發(fā)送功能;表現層主要實現數據的顯示和數據的即時更新,以及提供用戶操作的界面和接口。系統(tǒng)結構如圖1所示。
(1)業(yè)務邏輯層的實現
在業(yè)務邏輯層,一是需要定義消息類,實現對消息要素進行封裝,從而便于發(fā)送該消息;二是消息發(fā)送類,可以實現將消息發(fā)送到連接服務器的所有需要接收消息的客戶端。消息類及消息發(fā)送類的核心代碼如下。
a.定義消息類
(2)表現層的實現
在表現層,一是設計用戶操作界面,以提供用戶操作的接口,同時,還需借助JavaScript和AJAX將接收到的數據顯示出來;二是表現層需調用業(yè)務邏輯層的功能,實現消息的封裝以及消息的發(fā)送。用戶操作界面的HTML代碼及相應的JavaScript和AJAX代碼比較簡單,本文省略;調用入口類的核心代碼如下。
Comet技術在解決數據實時推送到客戶端方面有著獨特的優(yōu)勢,本文從Comet技術的基本原理入手,介紹了幾種實現Comet的主流方法,并以其中一種方式結合AJAX技術實現了基于ASP.NET的即時通信系統(tǒng)。
由于服務器及客戶端技術的不斷發(fā)展,Comet的實現方法也會有更多更好的選擇,在Comet廣泛應用需求的基礎上,Comet的應用會和AJAX一樣變得更加普及。
[1] 文愛平、文德民.基于IE瀏覽器的A jax Comet架構[J].電腦知識與技術,2010,6:4646-4648.
[2] 錢宇虹.淺析Comet技術在Java Web實時系統(tǒng)開發(fā)中的應用[J].軟件工程師,2010,4:45-47.
[3] 景慎艷.基于Pushlet的服務器推技術的研究與應用[J].現代計算機(專業(yè)版),2009,10:132-134.
[4] 孫清國、朱瑋、劉華軍、張鵬.Web應用中的服務器推送技術研究綜述[J].計算機系統(tǒng)應用,2008,11:116-120.