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