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