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