摘要:WebIM,是基于HTTP協(xié)議,系統(tǒng)采用B/S結(jié)構(gòu)進(jìn)行開(kāi)發(fā),客戶端以網(wǎng)頁(yè)的形式實(shí)現(xiàn)與openfire服務(wù)器及其它客戶端的及時(shí)通信。這種B/S結(jié)構(gòu)的系統(tǒng)功能在服務(wù)器端統(tǒng)一管理與維護(hù),既降低了維護(hù)難度,也使系統(tǒng)部署費(fèi)用得到減少。因此,Web IM技術(shù)將在基于即時(shí)通信及Web的遠(yuǎn)程監(jiān)控、網(wǎng)站客服等方面有重大的意義。為解決現(xiàn)有WebIM系統(tǒng)客戶端“拉”(Client_pull)模式周期請(qǐng)求而產(chǎn)生的系統(tǒng)消息延遲,以及客戶端和服務(wù)器端通信量大的問(wèn)題,提出了利用服務(wù)器“推”(Server-push)模式技術(shù)作為基礎(chǔ)的WebIM系統(tǒng),并選擇openfire開(kāi)源服務(wù)器及支持XMPP作為服務(wù)器和客戶端的通信協(xié)議。并給出了實(shí)現(xiàn)HTTP長(zhǎng)連接的策略。并開(kāi)發(fā)實(shí)現(xiàn)了WebIM系統(tǒng),采用服務(wù)器推送方式使用戶在體驗(yàn)方面得到改進(jìn),Web用戶將不會(huì)感覺(jué)到消息的延遲。
關(guān)鍵詞:IM;WebIM;通信;網(wǎng)絡(luò)
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)09-1971-05
傳統(tǒng)的基于WebIM的引擎設(shè)計(jì)方式大多使Ajax無(wú)刷新交互技術(shù)實(shí)現(xiàn),設(shè)計(jì)一種時(shí)間間隔定期獲取數(shù)據(jù)。它是一種基于客戶端不斷向服務(wù)器發(fā)出請(qǐng)求,以實(shí)現(xiàn)與服務(wù)器保持同步。 但從基于這技術(shù)的產(chǎn)品實(shí)際效果來(lái)看,客戶與客戶之間的數(shù)據(jù)信息延遲有時(shí)會(huì)很大,不是很穩(wěn)定。同時(shí),大量的同步請(qǐng)求數(shù)據(jù)使得服務(wù)器和客戶端之間的通信量增大,使網(wǎng)絡(luò)的性能下降,服務(wù)器負(fù)載過(guò)重。該文通過(guò)對(duì)現(xiàn)有WebIM進(jìn)行了研究,分析了XMPP技術(shù),提出了以支持XMPP的openfire服務(wù)器推送技術(shù)來(lái)代替?zhèn)鹘y(tǒng)客戶周期性的請(qǐng)求保持同步,致使客戶數(shù)據(jù)更新的基于B/S結(jié)構(gòu)的WebIM系統(tǒng),并通過(guò)佛山一呼百應(yīng)移動(dòng)電子商務(wù)平臺(tái)項(xiàng)目的WebIm系統(tǒng)驗(yàn)證了該方案的可行性,有效性。原型系統(tǒng)也可以擴(kuò)展到類似系統(tǒng)中。
本文設(shè)計(jì)與實(shí)現(xiàn)的Webim系統(tǒng)是以openfire為服務(wù)器,以xmpp技術(shù)更新數(shù)據(jù)??蛻舳送ㄟ^(guò)瀏覽器登錄服務(wù)器后,即時(shí)更新用戶UI數(shù)據(jù)。Openfire服務(wù)器通過(guò)xmpp技術(shù)得到新的數(shù)據(jù)后,即時(shí)向客戶端推送。發(fā)送完后,客戶端瀏器與openfire繼續(xù)保持連接,等待下一次數(shù)據(jù)的更新。xmpp技術(shù)采用長(zhǎng)連接及服務(wù)器的推送方式,減少了客戶端的請(qǐng)求,同時(shí)也減少了openfire服務(wù)器的響應(yīng)時(shí)間,也節(jié)省了網(wǎng)絡(luò)帶寬,改善了服務(wù)器也與客戶端的傳輸性能,從而延遲得到減少,用戶的體驗(yàn)會(huì)更好。
1 傳統(tǒng)的WebIM存在的問(wèn)題
1.1延遲
現(xiàn)有許多WebIM系統(tǒng)為了增強(qiáng)用戶體驗(yàn),使用AJAX技術(shù)進(jìn)行異步通信,WebIM客戶端游覽器按照設(shè)定的時(shí)間間隔定時(shí)向服務(wù)器刷新數(shù)據(jù)。當(dāng)客戶端與客戶端交換信息時(shí),發(fā)送端先把數(shù)據(jù)發(fā)送到服務(wù)器存儲(chǔ),然后當(dāng)接收端向服務(wù)器端請(qǐng)求數(shù)據(jù)時(shí),才能獲取新的數(shù)據(jù)。在這個(gè)過(guò)程中客戶端通信延遲的最小時(shí)間間隔將是AJAX異步請(qǐng)求。但在實(shí)際的應(yīng)用中,客戶端消息的延遲將大于這個(gè)時(shí)間間隔,因?yàn)榉?wù)器端需要處理數(shù)據(jù)庫(kù)事務(wù)以及實(shí)例化AJAX客戶端的對(duì)象。所以現(xiàn)有WebIM系統(tǒng)中,普遍存在消息延遲的情況。
1.2 通信量大,通信性能差
WebIM客戶端為了與服務(wù)器保持同步,需周期性向服務(wù)器發(fā)送信息,為了減少傳送信息的延遲,必須將周期訪問(wèn)時(shí)間設(shè)置很小,這將對(duì)服務(wù)器產(chǎn)生壓力,因?yàn)檫@些“心跳”信息只是使服務(wù)器與客戶端維持同步,使用戶和用戶維持在線狀態(tài),相當(dāng)一些控制,而不是實(shí)際有效信息。過(guò)多的這些數(shù)據(jù)增加了服務(wù)器的負(fù)載,增大延遲。另外如果客戶之間的消息更新的頻率很慢時(shí),服務(wù)器需要額外去響應(yīng)客戶端的心跳信息,并還需返回類似于
2 xmpp技術(shù)帶來(lái)的改變
xmpp通過(guò)建立一個(gè)和Openfire服務(wù)器的長(zhǎng)連接,當(dāng)openfire服務(wù)器獲取了新的數(shù)據(jù)時(shí),通過(guò)該長(zhǎng)連接即時(shí)向客戶端進(jìn)行推送,客戶端從長(zhǎng)連接管道中得到了數(shù)據(jù)的更新。使用xmpp技術(shù)所建立的長(zhǎng)連接機(jī)制,能很好地解決了二個(gè)問(wèn)題,第一,即時(shí)推送,消息即時(shí),無(wú)延遲。第二,長(zhǎng)連接機(jī)制,減少了建立與關(guān)閉連接數(shù),在整個(gè)通信過(guò)程中,長(zhǎng)連接一直維持,直至客戶端主動(dòng)退出系統(tǒng),從而減少了通信量,改善了能信性能。
HTTP長(zhǎng)連接策略:
openfire服務(wù)器支持xmpp技術(shù)采用推送。當(dāng)服務(wù)器端的信息有變化時(shí),主動(dòng)推送,而不需要客戶端請(qǐng)求。推送技術(shù)主要有以下兩種: (1)HTTP流方式(2)長(zhǎng)輪詢方式
在HTTP1.1規(guī)范中規(guī)定,客戶端與服務(wù)器端的HTTP的連接不能超過(guò)兩個(gè),如果超過(guò)二個(gè)的連接,將會(huì)被阻塞丟掉。所以在每個(gè)WebIM客戶端和服務(wù)器之間只建立一個(gè)HTTP的長(zhǎng)連接,也符合HTTP規(guī)范要求,也改善了網(wǎng)絡(luò)的性能。長(zhǎng)連接管道中XMPP消息按優(yōu)先級(jí)排列:聊天消息:聯(lián)系人的消息:公告消息,來(lái)進(jìn)行發(fā)送。在openfire中與客戶的連接中最核心的Servlet技術(shù)是Connection_Servlet,它實(shí)現(xiàn)HttpServlet接口類,private的成員變量中保留了Continuation類的對(duì)象,使瀏覽器客戶端和openfire服務(wù)器端的HTTP長(zhǎng)連接得到維持。
3 客戶端設(shè)計(jì)與實(shí)現(xiàn)
3.1 通信協(xié)議
WebIM系統(tǒng)設(shè)計(jì)使用XMPP(exten-siblemessagingandpresenceprotocol,可擴(kuò)展消息處理在線協(xié)議)協(xié)議,它是基于可擴(kuò)展標(biāo)記語(yǔ)言 (XML)的協(xié)議,用于即時(shí)信息(IM)以及實(shí)時(shí)在線探測(cè)。XML流通過(guò)在TCP/IP鏈路上完成服務(wù)器端和客戶端的傳輸通信,所有通信開(kāi)始以流結(jié)點(diǎn)開(kāi)始,通信結(jié)束以流作為結(jié)束。web客戶端通過(guò)解析XML來(lái)獲取傳輸?shù)男畔?nèi)容。
圖1 XMPP工作原理,所有從一個(gè)client到另一個(gè)client的jabber消息和數(shù)據(jù)都要通過(guò)xmpp server。
1)client連接到server
2)server利用本地目錄系統(tǒng)的證書(shū)對(duì)其認(rèn)證
3)client制定目標(biāo)地址讓server告知目標(biāo)狀態(tài)
4)server查找連接并進(jìn)行相互認(rèn)證
5)client間進(jìn)行交互
3.2 web客戶端與openfire通信線程的設(shè)計(jì)
web客戶端與openfire通信線程設(shè)計(jì)分三個(gè)過(guò)程,第一個(gè)過(guò)程是登錄,接著第二個(gè)過(guò)程是正常即時(shí)通信,第三個(gè)過(guò)程,退出系統(tǒng)。登錄與退出啟用相同的線程,由webim的發(fā)起。正常通信,由openfire發(fā)起。當(dāng)客戶端首次登錄時(shí),啟用一個(gè)客戶端請(qǐng)求線程,用來(lái)從openfire獲取用戶好友列表信息和用戶個(gè)人信息及用戶狀態(tài)信息來(lái)更新當(dāng)前用戶的信息。當(dāng)通信結(jié)束客戶退出系統(tǒng),該線程立即被激活,通過(guò)發(fā)送XMPP的XML數(shù)據(jù)流,類似于
當(dāng)客戶端登錄成功后,WebIM端將啟動(dòng)一個(gè)HTTP的長(zhǎng)連接來(lái)監(jiān)聽(tīng)服務(wù)器端更新的數(shù)據(jù),服務(wù)器將是將變化的數(shù)據(jù)以基于xmpp的XML流方式通過(guò)長(zhǎng)連接通道傳輸客戶端瀏覽器,客戶端UI界面及交換的數(shù)據(jù)信息得到更新。具體流程如圖3所示。
3.3 客戶端的實(shí)現(xiàn)
本系統(tǒng)客戶端的實(shí)現(xiàn)使用xmpp的Http和Openfire通信的JabberHTTPBind。JabberHTTPBind是jabber提供的XMPP協(xié)議通信的Http bind發(fā)送的形式,它可以完成WebBrowser和Openfire建立長(zhǎng)連接通信。Web客戶端用戶ClientA通過(guò)jsjac.js核心通信模塊庫(kù)發(fā)送一條消息到JabberHTTPBind,然后JabberHTTPBind會(huì)向Openfire發(fā)送XMPP協(xié)議的XML的信息。Openfire服務(wù)器接收到xml流后進(jìn)行解析,然后發(fā)送給指定的ClientB。用戶。JabberHTTPBind獲取到Openfire 服務(wù)器發(fā)送的數(shù)據(jù)后,解析報(bào)文向當(dāng)前Servlet容器中的鏈接的Session中找到指定的用戶再發(fā)送數(shù)據(jù)給ClientB,如圖4所示。WebBrowser端用的是jsjac和JabberHTTPBind建立的連接,所有數(shù)據(jù)都要經(jīng)過(guò)JabberHTTPBind解析/轉(zhuǎn)換發(fā)送給Openfire服務(wù)器。
圖4 web客戶端與openfire服務(wù)器的通信方式
Web客戶端的詳細(xì)實(shí)現(xiàn):
1)客戶端UI,包括聊天窗口,登陸、消息、日志等
與openfire服務(wù)器連接地址設(shè)置,window["serverDomin"]指定其中一個(gè)openfire服務(wù)器的地址,否則客戶端無(wú)法通訊。
建立一個(gè)聊天窗口應(yīng)用,并設(shè)置發(fā)送者和消息接收者,登陸到openfire服務(wù)器。退出openfire登陸,斷開(kāi)鏈接。建立一個(gè)新聊天窗口,并設(shè)置消息接收者的實(shí)現(xiàn)。
$WebIM()方法是主函數(shù),它可以完成聊天窗口的創(chuàng)建。$.WebIM.newWebIM方法是新創(chuàng)建一個(gè)新用戶一個(gè)窗口,這個(gè)窗口代表了一個(gè)新的用戶。
2)本地聊天應(yīng)用核心代碼
包括發(fā)送消息; 獲取即將發(fā)送的內(nèi)容;接收區(qū)域?qū)懴ⅲ?判斷是否是移動(dòng)端會(huì)話信息;如果是就發(fā)送純文本信息,否則就發(fā)送其他代碼; 遠(yuǎn)程發(fā)送消息; 非移動(dòng)端通信 可以發(fā)送html代碼; 清空發(fā)送區(qū)域。
3)遠(yuǎn)程聊天JavaScript核心代碼,與jsjac庫(kù)關(guān)聯(lián)的
構(gòu)建jsjac的message對(duì)象
安裝(注冊(cè))Connection事件模型
向chat接收信息區(qū)域?qū)懴?/p>
建立連接觸發(fā)事件的方法
4)消息區(qū)域、編輯器代碼 send.message.editor.js
5)web.xml配置
4 項(xiàng)目實(shí)施的結(jié)果與分析
第一,對(duì)HTTP長(zhǎng)連接狀態(tài)進(jìn)行了監(jiān)測(cè),利用網(wǎng)絡(luò)包監(jiān)測(cè)分析工具對(duì)WebIM客戶端和openfire的HTTP長(zhǎng)連接進(jìn)行了監(jiān)測(cè),web客戶端初次請(qǐng)求服務(wù)器端openfire時(shí),服務(wù)器端openfire與客戶端瀏覽器建立長(zhǎng)連接,當(dāng)openfire服務(wù)器有新的數(shù)據(jù)更新時(shí),即時(shí)通過(guò)建立的長(zhǎng)連接推送給客戶端瀏覽器。推送的內(nèi)容為xml流信息,查看服務(wù)器連接狀態(tài)和客戶端狀態(tài)都為ESTABLISHED狀態(tài),說(shuō)明HTTP長(zhǎng)連接存在。從監(jiān)測(cè)發(fā)現(xiàn)客戶端始終和服務(wù)器端在整個(gè)通信過(guò)程中從未斷開(kāi)連接,能高效地保障數(shù)據(jù)的通信。
第二,當(dāng)服務(wù)器端和客戶端在設(shè)定的時(shí)間內(nèi)沒(méi)有進(jìn)行通信時(shí)客戶端和服務(wù)器端處于半連接狀態(tài),客戶端將變?yōu)镕IN_WAIT_2連接狀態(tài),服務(wù)器變?yōu)镃LOSE_WAIT連接狀態(tài),但只要有數(shù)據(jù)流產(chǎn)生,客戶端和服務(wù)器狀態(tài)又將轉(zhuǎn)變成ESTABLISHED狀態(tài),即正常即時(shí)通信。
第三,當(dāng)客戶端退出或關(guān)閉時(shí),服務(wù)器端與客戶端的長(zhǎng)連接將被終止,同時(shí)服務(wù)器端資源也補(bǔ)釋放,以及發(fā)送好友信息,更新好友列表和用戶UI等信息。
通過(guò)開(kāi)發(fā),實(shí)現(xiàn)了本webim系統(tǒng),使用xmpp實(shí)現(xiàn)HTTP長(zhǎng)連接是有效的,也是可行的。根據(jù)系統(tǒng)對(duì)本項(xiàng)目在廣州佛山一呼百應(yīng)移動(dòng)電商平臺(tái)的應(yīng)用監(jiān)測(cè),基于openfire服務(wù)器和xmpp技術(shù)構(gòu)建的WebIM系統(tǒng)將很好的解決消息延遲的情況。滿足了設(shè)計(jì)初要求,具有良好的運(yùn)營(yíng)性能。
5 結(jié)束語(yǔ)
WebIM系統(tǒng)在用戶無(wú)需安裝其它客戶軟件,就可以通過(guò)客戶瀏覽器連接到im系統(tǒng)服務(wù)器端,方便用戶使用。本系統(tǒng)客戶端的實(shí)現(xiàn)使用xmpp技術(shù)和Openfire服務(wù)器技術(shù)xmpp技術(shù)通信的JabberHTTPBind。JabberHTTPBind是jabber提供的XMPP協(xié)議通信的Httpbind發(fā)送的形式,它可以完成WebBrowser和Openfire建立長(zhǎng)連接通信,也是一種基于B/S架構(gòu)的連接方式。本系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)基于xmpp技術(shù)的長(zhǎng)連接方式,采用服務(wù)器推送信息,信息延遲減少,使用戶體驗(yàn)方面有所改進(jìn)。通過(guò)長(zhǎng)連接方式,減少多次建立或關(guān)閉服務(wù)器與客端的連接,為服務(wù)器端減少了負(fù)載,改善了即時(shí)通信的性能,同時(shí)也能方便擴(kuò)展到其他系統(tǒng)中,具有推廣價(jià)值。
參考文獻(xiàn):
[1] 顧治華,劉家璽,汪津.基于XMPP協(xié)議的ejabberd服務(wù)器黑名單實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2010(18).
[2] 王振興,黃靜.基于php和服務(wù)器推技術(shù)的Web即時(shí)聊天系統(tǒng)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2012(12).