專利名稱:一種基于xmpp協(xié)議的即時(shí)消息傳輸方法
技術(shù)領(lǐng)域:
本發(fā)明是基于企業(yè)即時(shí)消息技術(shù)在融合通信中的應(yīng)用,在網(wǎng)頁版的融合通信終端實(shí)現(xiàn)與企業(yè)即時(shí)通信系統(tǒng)之間連接的功能。
背景技術(shù):
信息技術(shù)發(fā)展到今天,人們希望方便快捷、無處不在地享用網(wǎng)絡(luò)信息技術(shù),通信與計(jì)算機(jī)技術(shù)的融合應(yīng)用是信息產(chǎn)業(yè)發(fā)展的趨勢(shì),簡(jiǎn)單的、安全的、費(fèi)用低廉的,可以隨時(shí)隨地接入的融合通信,是人們的最高期望。技術(shù)的不斷成熟,使得即時(shí)消息系統(tǒng)越來越豐富,因而當(dāng)人們需要使用多個(gè)聊天工具時(shí),就使得人們使用的方便性降低,而且對(duì)計(jì)算機(jī)資源的消耗也大大增加。此背景下, 開發(fā)人員就希望能將多種即時(shí)消息工具集成到一起,于是就誕生了多協(xié)議頂技木。例如, 國內(nèi)My頂,同時(shí)支持MSN、QQ等五種協(xié)議;國外的Miranda IM支持ICQ、AM、MSN等協(xié)議; 開源項(xiàng)目Open fire和Spark支持多操作系統(tǒng),可以通過插件方式對(duì)即時(shí)消息協(xié)議進(jìn)行擴(kuò)充,而且Spark開源代碼中用戶界面部分和Openfire負(fù)責(zé)后臺(tái)協(xié)議解析進(jìn)行通信。一般地,目前支持多協(xié)議即時(shí)消息的軟件產(chǎn)品都是以客戶端軟件的方式提供給用戶,用戶在使用之前需要在個(gè)人的電腦上進(jìn)行安裝設(shè)置。企業(yè)級(jí)即時(shí)通信系統(tǒng)的出現(xiàn),在傳統(tǒng)的即時(shí)通信的靈活、快捷、方便等優(yōu)勢(shì)的基礎(chǔ)上,更重要的在安全性、可管理性、可追溯性、可擴(kuò)展性等方面都得到了一定程度的保障。由于各大廠商都有自己的IM產(chǎn)品,出于各自利益的考慮,大部分都采用了自己私有的通信協(xié)議,這在一定程度上阻礙了使用不同即時(shí)通信系統(tǒng)的企業(yè)與企業(yè)之間的溝通交流,因此在企業(yè)級(jí)即時(shí)通信的產(chǎn)品中急需ー種使用開放式的即時(shí)通信協(xié)議的EM以實(shí)現(xiàn)不同工具之間的互通互聯(lián),使EM更加便利。UC (Unified Communication,融合通信),也常翻譯為統(tǒng)一通信。融合通信是指, 把計(jì)算機(jī)技術(shù)與傳統(tǒng)通信技術(shù)融合一體的新通信模式,融合計(jì)算機(jī)網(wǎng)絡(luò)與傳統(tǒng)通信網(wǎng)絡(luò)在一個(gè)網(wǎng)絡(luò)平臺(tái)上,實(shí)現(xiàn)電話、傳真、數(shù)據(jù)傳輸、音視頻會(huì)議、呼叫中心、即時(shí)通信等眾多應(yīng)用服務(wù)。融合通信將話音、視頻、短信、即時(shí)消息等多種應(yīng)用融合在一起,其手段也是豐富多彩的,可以體現(xiàn)在網(wǎng)絡(luò)的融合、終端的融合、應(yīng)用的融合等各個(gè)層面。以下介紹ー下本發(fā)明所涉及的幾種網(wǎng)絡(luò)技術(shù)
I、XMPP 技術(shù)
XMPP(Extensible Messaging and Presence Protocol,可擴(kuò)展消息與出席協(xié)議)是一種基于可擴(kuò)展標(biāo)記語言XML的開放式協(xié)議。ー個(gè)XML流相當(dāng)于ー個(gè)會(huì)話期間所有XML節(jié)的 ー個(gè)信封,客戶端或服務(wù)器發(fā)送的所有XML文本連綴在一起,從〈stream〉到〈/stream〉構(gòu)成了一個(gè)完整的XML文檔,其中的stream標(biāo)簽就是XML Stream。在〈stream〉與〈/stream〉 中間的那些<message>〈/message>這樣的XML元素就是XML Stanza (XML節(jié))。XMPP協(xié)議的核心協(xié)議通信的基本模式就是先建立ー個(gè)stream,通過TCP/IP連接到服務(wù)器,然后協(xié)商 TLS和SASL進(jìn)行身份驗(yàn)證和安全協(xié)商,通信過程就是在網(wǎng)絡(luò)上分片斷發(fā)送XML Stanza, 一個(gè)接ー個(gè)。服務(wù)器根據(jù)客戶端發(fā)送的信息以及程序的邏輯,發(fā)送XML Stanza給客戶端。通信的最后階段是〈/stream〉關(guān)閉流,關(guān)閉TCP/IP連接。這個(gè)流協(xié)議是XMPP的即時(shí)通訊指令的傳遞手段,也是一個(gè)非常重要的可以被進(jìn)一步利用的網(wǎng)絡(luò)基礎(chǔ)協(xié)議。所以,XMPP就是在TCP連接上傳輸XML流。2、SOCKS 技術(shù)
SOCKS代理工作在TCP/IP模型的線路層(即應(yīng)用層和傳輸層之間)。SOCKS 5技術(shù),其具體工作方案為客戶端首先和SOCKS 5代理服務(wù)器建立連接,然后客戶端所有的數(shù)據(jù)包都以TCP數(shù)據(jù)包的方式發(fā)送到代理服務(wù)器,然后代理服務(wù)器幫助轉(zhuǎn)發(fā)所有的請(qǐng)求。對(duì)于接收端來說,它認(rèn)為所有的請(qǐng)求都來自代理服務(wù)器,把代理服務(wù)器作為客戶進(jìn)行通信,代理服務(wù)器接收遠(yuǎn)端發(fā)送來的消息后,根據(jù)客戶列表把數(shù)據(jù)分發(fā)給不同的客戶。其工作流程為
(O 客戶端向代理服務(wù)器建立TCP連接;
(2)向代理服務(wù)器發(fā)送代理請(qǐng)求信息;
(3)接收代理的應(yīng)答,根據(jù)相應(yīng)標(biāo)志判斷是否允許代理;
(4)客戶端向代理發(fā)送協(xié)商請(qǐng)求信息及相關(guān)端口信息;
(5)代理返回協(xié)商請(qǐng)求結(jié)果及代理端口等信息;
(6)客戶端將數(shù)據(jù)發(fā)送到代理服務(wù)器并由其代理進(jìn)行數(shù)據(jù)傳送等操作。3、數(shù)據(jù)庫技術(shù)
數(shù)據(jù)庫技術(shù)是該系統(tǒng)的一個(gè)核心技術(shù),是一種計(jì)算機(jī)輔助管理數(shù)據(jù)的方法,它研究如何組織和存儲(chǔ)數(shù)據(jù),如何高效地獲取和處理數(shù)據(jù)。通過對(duì)數(shù)據(jù)庫結(jié)構(gòu)、存儲(chǔ)、設(shè)計(jì)、管理以及應(yīng)用的基本理論和實(shí)現(xiàn)方法的研究,并利用這些理論來實(shí)現(xiàn)對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行處理、 分析和理解的技術(shù)。數(shù)據(jù)庫中常見的數(shù)據(jù)模型主要有層次模型,網(wǎng)狀模型和關(guān)系模型3種。MYSQL數(shù)據(jù)庫是一個(gè)小型關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。4、套接字技術(shù)
套接字,也稱之為〃socket",用于描述IP地址和端口,是一個(gè)通信鏈的句柄。應(yīng)用程序通常通過“套接字”向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求。Socket實(shí)質(zhì)上提供了進(jìn)程通信的端點(diǎn),進(jìn)程通信之前,雙方首先必須各自創(chuàng)建一個(gè)端點(diǎn),否則是沒有辦法建立聯(lián)系并相互通信的,正如打電話之前,雙方必須各自擁有一臺(tái)電話機(jī)一樣。在網(wǎng)間網(wǎng)內(nèi)部,每一個(gè)socket用一個(gè)半相關(guān)描述(協(xié)議,本地地址,本地端口),一個(gè)完整的socket有一個(gè)本地唯一的socket號(hào),由操作系統(tǒng)分配。根據(jù)連接啟動(dòng)的方式以及本地套接字要連接的目標(biāo),套接字之間的連接過程可以分為三個(gè)步驟服務(wù)器監(jiān)聽,客戶端請(qǐng)求,連接確認(rèn)。
(I)服務(wù)器監(jiān)聽是服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)。(2)客戶端請(qǐng)求是指由客戶端的套接字提出連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號(hào),然后就向服務(wù)器端套接字提出連接請(qǐng)求。(3)連接確認(rèn)是指當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請(qǐng)求,它就響應(yīng)客戶端套接字的請(qǐng)求,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,連接就建立好了。服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請(qǐng)求。5、網(wǎng)關(guān)技術(shù)
網(wǎng)關(guān),又稱網(wǎng)間連接器、協(xié)議轉(zhuǎn)換器。網(wǎng)關(guān)在傳輸層上以實(shí)現(xiàn)網(wǎng)絡(luò)互連,是最復(fù)雜的網(wǎng)絡(luò)互連設(shè)備,僅用于兩個(gè)高層協(xié)議不同的網(wǎng)絡(luò)互連。網(wǎng)關(guān)的結(jié)構(gòu)也和路由器類似,不同的是互連層。采用網(wǎng)關(guān)技術(shù),一方面滿足了不同用戶群之間相互交流的需要,另ー方面對(duì)于頂服務(wù)用戶來說,只需對(duì)外提供一個(gè)信息轉(zhuǎn)換的網(wǎng)關(guān)接入點(diǎn),無需對(duì)原有協(xié)議作過多改變。XMPP網(wǎng)關(guān)的主要功能是把XMPP消息翻譯成使用非XMPP的頂?shù)耐ㄐ鸥袷?,同時(shí)把非XMPP的IM系統(tǒng)返回的數(shù)據(jù)翻譯回XMPP消息。非XMPP的IM有A頂、ICQ、MSN、QQ等。XMPP系統(tǒng)中網(wǎng)關(guān)是通過傳輸器組件(Transport)實(shí)現(xiàn)的。其工作原理為XMPP系統(tǒng)的客戶端發(fā)送消息給非XMPP系統(tǒng)的客戶端,首先指明ー個(gè)包含非XMPP系統(tǒng)名的JID,而不是直接發(fā)送給外部頂系統(tǒng)上的用戶。其次,XMPP服務(wù)器將數(shù)據(jù)發(fā)送到指定的傳輸器應(yīng)用程序,如果傳輸器是本地的,則XMPP服務(wù)器直接與其進(jìn)行通信;如果傳輸器不在本地運(yùn)行, 本地服務(wù)器發(fā)送ー個(gè)包給遠(yuǎn)程服務(wù)器,該遠(yuǎn)程服務(wù)器將會(huì)把包發(fā)送給指定的傳輸器。一旦傳輸器接收到XML包,它把信息“轉(zhuǎn)變”成另ー個(gè)IM網(wǎng)絡(luò)中可以識(shí)別的本地包,并把這個(gè)本地包傳送到那個(gè)頂網(wǎng)絡(luò)中。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是針對(duì)使用不同即時(shí)通信系統(tǒng)的企業(yè)與企業(yè)之間的溝通交流的問題,基于XMPP協(xié)議及其擴(kuò)展協(xié)議,設(shè)計(jì)ー種基于XMPP協(xié)議的即時(shí)消息傳輸技術(shù)的方法。本發(fā)明為解決上述技術(shù)問題,采用以下技術(shù)方案
一種基于XMPP協(xié)議的即時(shí)消息傳輸方法,使用開源的Openfire作為服務(wù)器,以Spark 客戶端作為主要框架,以MySQL作為數(shù)據(jù)庫,采用XMPP技術(shù)、SOCKS技術(shù)、數(shù)據(jù)庫技術(shù),套接字技術(shù)和網(wǎng)關(guān)技術(shù),在Smack客戶端庫建立一個(gè)基于XMPP協(xié)議的客戶端,實(shí)現(xiàn)企業(yè)內(nèi)部以及企業(yè)外部的即時(shí)消息之間的數(shù)據(jù)傳輸;其中
所述基于XMPP協(xié)議的客戶端進(jìn)行數(shù)據(jù)傳輸?shù)倪^程如下
A、實(shí)現(xiàn)用戶注冊(cè)功能
步驟Al :采用用戶注冊(cè)模塊初始化注冊(cè)界面;用戶在注冊(cè)界面中輸入用戶名、密碼、確認(rèn)密碼和服務(wù)器的IP,將上述信息發(fā)送至用戶注冊(cè)模塊;
步驟A2 :用戶注冊(cè)模塊驗(yàn)證用戶輸入信息是否有效;當(dāng)用戶輸入的數(shù)據(jù)無誤,則繼續(xù)下ー步驟;
步驟A3 :讀取服務(wù)器主機(jī)名和端口號(hào);客戶端通過協(xié)議解析模塊將用戶注冊(cè)信息轉(zhuǎn)換為XMPP請(qǐng)求數(shù)據(jù);
步驟A4 :客戶端通過底層通信模塊與服務(wù)器建立連接,向服務(wù)器發(fā)送用戶注冊(cè)請(qǐng)求; 步驟A5 :通過底層通信模塊監(jiān)聽來自服務(wù)器的響應(yīng),客戶端啟動(dòng)監(jiān)聽時(shí)延;
步驟A6 :判斷在時(shí)延內(nèi)客戶端是否收到來自服務(wù)器的響應(yīng),若收到響應(yīng),進(jìn)ー步判定該響應(yīng)是否有誤;若沒有錯(cuò)誤,則協(xié)議解析模塊處理響應(yīng),并在客戶端界面顯示用戶注冊(cè)成功,結(jié)束用戶注冊(cè)操作;若響應(yīng)有誤,則客戶端界面顯示用戶注冊(cè)失敗,結(jié)束用戶注冊(cè)操作;
B、實(shí)現(xiàn)用戶登錄功能
步驟BI :啟動(dòng)客戶端登陸界面后,采用用戶登錄模塊進(jìn)行初始化工作;
步驟B2 :用戶在客戶端的用戶登錄界面輸入用戶名、密碼和服務(wù)器的IP,將上述信息發(fā)送至用戶登錄模塊;
步驟B3 :用戶登錄模塊獲取輸入信息,然后讀取服務(wù)器的主機(jī)名和密碼;
步驟B4 :通過客戶端后臺(tái)的協(xié)議解析模塊將登錄信息解析為XMPP數(shù)據(jù)請(qǐng)求包;
步驟B5 :通過底層通信模塊與服務(wù)器建立連接,向服務(wù)器發(fā)送用戶登錄請(qǐng)求;
步驟B6 :客戶端創(chuàng)建新的監(jiān)聽,并設(shè)立時(shí)延;
步驟B7 :判斷在時(shí)延內(nèi)客戶端是否收到來自服務(wù)器的響應(yīng),若收到,進(jìn)一步判斷該響應(yīng)是否有誤,若沒有錯(cuò)誤,則協(xié)議解析模塊處理響應(yīng),并在客戶端界面顯示用戶登錄成功, 結(jié)束用戶登錄操作;若響應(yīng)有誤,則客戶端界面顯示用戶登錄失敗,結(jié)束用戶登錄操作;
C、實(shí)現(xiàn)狀態(tài)訂閱功能
步驟Cl :客戶端與服務(wù)器建立連接;
步驟C2 :客戶端向服務(wù)器申請(qǐng)獲取好友名冊(cè)中好友名單;
步驟C3 :服務(wù)器判斷好友名單中的第一個(gè)好友是否在線,若在線,則產(chǎn)生該好友上線的通知XML流發(fā)送給登錄用戶并告知該好友用戶登錄的狀態(tài),若不在線,繼續(xù)判斷第二個(gè)好友是否在線,依次類推,直至查詢完好友名單中的所有好友;
D、實(shí)現(xiàn)好友名冊(cè)管理功能
步驟Dl :客戶端與服務(wù)器建立連接;
步驟D2 :客戶端向服務(wù)器提出查詢好友列表請(qǐng)求;
步驟D3 :服務(wù)器響應(yīng)請(qǐng)求并以登錄用戶的JID為參數(shù)在好友列表查找其好友的JID,然后再根據(jù)查詢數(shù)據(jù)庫得到的好友信息結(jié)果中的好友JID,查詢他們的在線狀態(tài),然后將這些信息組合成XMPP協(xié)議的XML流返回給登錄用戶;
步驟D4 :客戶端顯示好友列表;
E、實(shí)現(xiàn)添加好友功能
步驟El :客戶端前端向服務(wù)器發(fā)出添加好友的請(qǐng)求;
步驟E2 :客戶端的協(xié)議解析模塊解析出要添加的好友的JID ;
步驟E3 :客戶端在本地搜索要添加的好友是否存在,若存在,則返回前端提示該用戶已是好友,無需添加,結(jié)束操作;若不存在,則通過底層通信模塊向服務(wù)器請(qǐng)求,通過服務(wù)器的數(shù)據(jù)訪問模塊以JID為條件在數(shù)據(jù)庫中的用戶表中查找該好友;
步驟E4 :若數(shù)據(jù)庫中的用戶表中存在該好友,則服務(wù)器端將結(jié)果返回給客戶端,并將所述JID插入到好友列表中,通過底層通信模塊,返回包含有該好友的信息的XML,提示添加好友成功,結(jié)束操作;
步驟E5 :若數(shù)據(jù)庫中的用戶表中不存在該好友,則向客戶端返回添加失敗的XML流,提示不存在此用戶;
F、實(shí)現(xiàn)刪除好友功能
步驟Fl :客戶端前端向服務(wù)器發(fā)出刪除好友的請(qǐng)求;
步驟F2 :服務(wù)器在收到客戶端發(fā)來的請(qǐng)求之后,通過協(xié)議解析模塊解析XML流,并獲取需要?jiǎng)h除的好友的JID;
步驟F3 :服務(wù)器通過數(shù)據(jù)庫訪問模塊在數(shù)據(jù)庫的好友列表中查詢?cè)撚脩?,并將其刪
除;
步驟F4 :若刪除成功,則向客戶端返回相應(yīng)的XML流,提示客戶端好友刪除成功,結(jié)束操作;
步驟F5 :若刪除失敗,則向客戶端返回相應(yīng)的XML流,提示客戶端刪除失敗;
G、實(shí)現(xiàn)客戶端與服務(wù)器之間的會(huì)話功能
步驟Gl :源客戶端通過底層通信功能模塊向第一 XMPP服務(wù)器發(fā)送建立會(huì)話的請(qǐng)求; 步驟G2 :第一 XMPP服務(wù)器在收到源客戶端的請(qǐng)求之后通過TLS,SASL進(jìn)行安全、身份驗(yàn)證,若通過,則向源客戶端返回確認(rèn)建立連接的響應(yīng);
步驟G3 :源客戶端通過協(xié)議解析功能模塊獲取客戶端界面的消息并將其封裝成XMPP 數(shù)據(jù)包,然后通過底層通信功能模塊向XMPP服務(wù)器發(fā)送會(huì)話內(nèi)容;
步驟G4 第一 XMPP服務(wù)器通過協(xié)議解析模塊進(jìn)行XMPP數(shù)據(jù)包解析,獲取數(shù)據(jù)包中目的客戶端的JID,通過數(shù)據(jù)庫訪問模塊查詢數(shù)據(jù)庫;
步驟G5 :若目的客戶端在本地服務(wù)器中,并且目的客戶端在線,則直接將數(shù)據(jù)包轉(zhuǎn)發(fā)給目的客戶端,結(jié)束會(huì)話并關(guān)閉連接;若目的客戶端不在線,則將XMPP數(shù)據(jù)包通過數(shù)據(jù)庫訪問模塊將XMPP數(shù)據(jù)包存入第一 XMPP服務(wù)器的數(shù)據(jù)庫,待目的客戶端上線后進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā);
步驟G6 :若目的客戶端不在本地服務(wù)器中,則服務(wù)器向DNS服務(wù)器發(fā)送申請(qǐng)解析域名的請(qǐng)求;
步驟G7 :采用DNS服務(wù)器搜索目的客戶端所在的第二 XMPP服務(wù)器,同時(shí)向第一 XMPP服務(wù)器返回解析后的域名;
步驟G8 :第一 XMPP服務(wù)器通過TCP三次握手、TLS、SASL以及服務(wù)器回?fù)芄δ苓M(jìn)行安全、身份驗(yàn)證,向第二 XMPP服務(wù)器發(fā)送連接請(qǐng)求;
步驟G911 :第二 XMPP服務(wù)器通過底層通信模塊向第一 XMPP服務(wù)器發(fā)送請(qǐng)求響應(yīng),若目的客戶端在線狀態(tài),則建立二者之間的連接,轉(zhuǎn)向步驟GlO ;若目的客戶端不在線,則將 XMPP數(shù)據(jù)包存入第一 XMPP服務(wù)器的數(shù)據(jù)庫中,待目的客戶端上線后再將該信息轉(zhuǎn)發(fā);
步驟GlO :第一 XMPP服務(wù)器向第二 XMPP服務(wù)器轉(zhuǎn)發(fā)由源客戶端發(fā)送的XMPP數(shù)據(jù)包; 步驟Gll :第二 XMPP服務(wù)器直接將XMPP數(shù)據(jù)包轉(zhuǎn)發(fā)到目的客戶端,結(jié)束會(huì)話并關(guān)閉連
接;
步驟G12 :源客戶端通過協(xié)議解析模塊獲取XMPP數(shù)據(jù)包之后,通過協(xié)議網(wǎng)關(guān),將數(shù)據(jù)包發(fā)送到非XMPP系統(tǒng)的服務(wù)器,再由非XMPP系統(tǒng)的服務(wù)器將數(shù)據(jù)包轉(zhuǎn)發(fā)到非XMPP系統(tǒng)的客戶端;
H、實(shí)現(xiàn)文件傳輸功能
步驟Hl :源客戶端向XMPP服務(wù)器發(fā)送向目的客戶端傳輸文件的請(qǐng)求;
步驟H2 =XMPP服務(wù)器通過數(shù)據(jù)訪問模塊訪問數(shù)據(jù)庫判斷目的客戶端是否屬于本地服務(wù)器,若目的客戶端不屬于本地服務(wù)器,則將請(qǐng)求轉(zhuǎn)向代理服務(wù)器,轉(zhuǎn)向步驟H5 ;
若目的客戶端屬于本地服務(wù)器,則判斷目的客戶端是否在線若在線,則向目的客戶端發(fā)送源客戶端文件傳輸?shù)恼?qǐng)求,井向源客戶端返回目的客戶端的JID,轉(zhuǎn)向步驟H3 ;若不在線,則將傳輸文件請(qǐng)求存放在服務(wù)器的緩沖區(qū),等目的客戶端在線時(shí),直接從緩沖區(qū)提取文件并轉(zhuǎn)發(fā)給目的客戶端,轉(zhuǎn)向步驟H12 ;
步驟H3 目的客戶端響應(yīng)XMPP服務(wù)器傳輸文件的請(qǐng)求,XMPP服務(wù)器將響應(yīng)發(fā)送給源客戶端;
步驟H4 :源客戶端向XMPP服務(wù)器傳輸文件,XMPP服務(wù)器直接將文件轉(zhuǎn)發(fā)給目的客戶端,轉(zhuǎn)向步驟H12 ;
步驟H5 目的客戶端為代理服務(wù)器打開一個(gè)TCP socket連接;
步驟H6 :代理服務(wù)器通過SOCKS 5與目的客戶端建立連接,設(shè)定目標(biāo)地址和目標(biāo)端口參數(shù)的值;
步驟H7 :代理服務(wù)器通過SOCKS 5發(fā)送連接成功并確認(rèn)至源的客戶端;
步驟HS :源客戶端為代理服務(wù)器打開一個(gè)TCPsocket連接;
步驟H9 :源客戶端通過SOCKS 5向代理服務(wù)器請(qǐng)求建立連接,設(shè)定目標(biāo)地址和目標(biāo)端口參數(shù)的值;
步驟HlO :若成功建立連接,源客戶端通過SOCKS 5發(fā)送連接成功確認(rèn)至目的客戶端
端;
步驟Hll :源客戶端和目的客戶端通過SOCKS 5代理服務(wù)器,再由SOCKS 5服務(wù)器轉(zhuǎn)發(fā)給XMPP服務(wù)器可以成功實(shí)現(xiàn)文件的傳輸;
步驟H12 :文件成功傳輸之后,關(guān)閉源客戶端和目的客戶端之間的連接;
I、實(shí)現(xiàn)頂互相通信功能XMPP系統(tǒng)的客戶端發(fā)送消息給非XMPP系統(tǒng)的客戶端, 首先指明一個(gè)包含非XMPP系統(tǒng)名的JID ;
其次,XMPP服務(wù)器將數(shù)據(jù)發(fā)送到指定的傳輸器應(yīng)用程序,如果傳輸器是本地的,則 XMPP服務(wù)器直接與其進(jìn)行通信;如果傳輸器不在本地運(yùn)行,本地服務(wù)器發(fā)送一個(gè)包給遠(yuǎn)程服務(wù)器,該遠(yuǎn)程服務(wù)器將會(huì)把包發(fā)送給指定的傳輸器;
一旦傳輸器接收到XML包,即把信息轉(zhuǎn)變成另一個(gè)IM網(wǎng)絡(luò)中可以識(shí)別的本地包,并把這個(gè)本地包傳送到那個(gè)頂網(wǎng)絡(luò)中。本發(fā)明采用以上技術(shù)方案具有以下技術(shù)效果
采用本發(fā)明的方法不僅能夠很好的滿足用戶的基本需求、管理需求與功能性需求外, 而且達(dá)到較高的安全性,可擴(kuò)展性,實(shí)現(xiàn)與其他即時(shí)通信系統(tǒng)的互聯(lián)互通。
圖I:本發(fā)明的網(wǎng)絡(luò)架構(gòu)圖。
圖2:本發(fā)明架構(gòu)的拓?fù)溥B接圖。
圖3=XML流傳輸過程分層結(jié)構(gòu)示意圖。
圖4:客戶端功能圖。
圖5:用戶注冊(cè)登錄圖。
圖6:用戶登錄流程圖。
圖7:好友上線通知流程圖。
圖8:獲取并顯示好友列表功能流程圖。
圖9:添加好友流程圖。
圖10:刪除好友流程圖。
圖11:發(fā)送消息流程圖。
圖12:接收消息流程圖。
圖13:文件傳輸功能流程圖。
圖14IM系統(tǒng)互相通信網(wǎng)絡(luò)圖。
具體實(shí)施方式
下面結(jié)合附圖對(duì)本發(fā)明的技術(shù)方案進(jìn)行詳細(xì)的說明
圖I是本發(fā)明的網(wǎng)絡(luò)架構(gòu)圖,由其可知,本發(fā)明用的是基于XMPP協(xié)議的開源的 Openfire作為服務(wù)器并將其部署到Eclipse平臺(tái)里并成功運(yùn)行,實(shí)現(xiàn)用戶的注冊(cè)以及數(shù)據(jù)庫的連接等功能。而客戶端是在Spark客戶端的基礎(chǔ)上,根據(jù)企業(yè)內(nèi)部通信的要求,開發(fā)出的符合企業(yè)要求的客戶端。圖2是本發(fā)明架構(gòu)的拓?fù)溥B接圖,由其可知,本發(fā)明采用Client—Sever架構(gòu)進(jìn)行實(shí)現(xiàn)的。在XMPP中定義了三個(gè)角色客戶端、服務(wù)器、網(wǎng)關(guān)。其中,客戶端通過TCP的方式使用XMPP訪問服務(wù)器,服務(wù)器也使用TCP的方式進(jìn)行通信。圖3是XML流傳輸過程分層結(jié)構(gòu)示意圖,由其可知,XML流在客戶端和服務(wù)器之間分層傳輸?shù)倪^程。圖4是基于XMPP協(xié)議的客戶端功能圖,由其可知,本系統(tǒng)客戶端需要設(shè)計(jì)實(shí)現(xiàn)的各個(gè)功能。圖5是客戶端用戶注冊(cè)流程圖,由其可知,用戶在客戶端界面注冊(cè)時(shí),數(shù)據(jù)從客戶端到服務(wù)器以及從服務(wù)器到客戶端被處理的整個(gè)流程,負(fù)責(zé)新用戶的注冊(cè)處理。步驟01 :用戶注冊(cè)模塊初始化注冊(cè)界面;
步驟02:用戶在注冊(cè)界面中輸入用戶名、密碼、確認(rèn)密碼和服務(wù)器的IP,點(diǎn)擊注冊(cè)按
鈕;
步驟03 :用戶注冊(cè)模塊監(jiān)聽來自鼠標(biāo)的請(qǐng)求,并從輸入框中獲取輸入信息同時(shí)進(jìn)行驗(yàn)證イ目息是否有效;
步驟04 :若用戶輸入的數(shù)據(jù)有誤,則提示用戶輸入有誤;如果用戶輸入的數(shù)據(jù)無誤,則繼續(xù)下ー步驟;
步驟05 :讀取服務(wù)器主機(jī)名和端口號(hào);
步驟06 :客戶端通過協(xié)議解析模塊將用戶注冊(cè)信息轉(zhuǎn)換為XMPP請(qǐng)求數(shù)據(jù);
步驟07 :客戶端通過底層通信模塊建立連接,向服務(wù)器發(fā)送用戶注冊(cè)請(qǐng)求;
步驟08 :通過底層通信模塊監(jiān)聽來自服務(wù)器的響應(yīng),客戶端啟動(dòng)監(jiān)聽時(shí)延;
步驟09 :在時(shí)延內(nèi)客戶端是否收到來自服務(wù)器的響應(yīng),若收到,判定響應(yīng)是否有誤,若沒有錯(cuò)誤,則協(xié)議解析模塊處理響應(yīng),并在客戶端界面顯示用戶注冊(cè)成功,轉(zhuǎn)向步驟11 ; 步驟10 :若響應(yīng)有誤,則客戶端界面顯示用戶注冊(cè)失敗,轉(zhuǎn)向步驟11 ;
步驟11:結(jié)束用戶注冊(cè)操作。圖6是客戶端用戶登錄流程圖,由其可知,用戶在客戶端登錄時(shí),數(shù)據(jù)從客戶端到服務(wù)器以及從服務(wù)器到客戶端被處理的整個(gè)流程。登錄驗(yàn)證服務(wù)是對(duì)試圖登錄的客戶端進(jìn)行權(quán)限驗(yàn)證。
步驟01 :啟動(dòng)客戶端登陸界面后,用戶登錄模塊進(jìn)行初始化工作;
步驟02:用戶在客戶端的用戶登錄界面輸入用戶名、密碼和服務(wù)器的IP,填寫完畢之后點(diǎn)擊登錄按鈕;
步驟03 :用戶登錄模塊監(jiān)聽到鼠標(biāo)操作事件,從登錄界面的輸入框中獲取輸入信息, 然后讀取服務(wù)器的主機(jī)名和密碼;
步驟04 :通過客戶端后臺(tái)的協(xié)議解析模塊將登錄信息解析為XMPP數(shù)據(jù)請(qǐng)求包;
步驟05 :通過底層通信模塊建立連接,向服務(wù)器發(fā)送用戶登錄請(qǐng)求;
步驟06 :客戶端創(chuàng)建新的監(jiān)聽,并設(shè)立時(shí)延;
步驟07 :在時(shí)延內(nèi)客戶端是否收到來自服務(wù)器的響應(yīng),若收到,判定響應(yīng)是否有誤,若沒有錯(cuò)誤,則協(xié)議解析模塊處理響應(yīng),并在客戶端界面顯示用戶登錄成功,轉(zhuǎn)向步驟09 ; 步驟08 :若響應(yīng)有誤,則客戶端界面顯示用戶登錄失敗,轉(zhuǎn)向步驟09 ;
步驟09:結(jié)束用戶登錄操作。狀態(tài)訂閱一個(gè)用戶可以訂閱其他好友的在線信息,一個(gè)訂閱本質(zhì)上是被訂閱者同意發(fā)送在線狀態(tài)改變給訂閱者。這個(gè)信息同時(shí)存儲(chǔ)在訂閱者和被訂閱者的名單中。當(dāng)用戶通過認(rèn)證并在服務(wù)器上創(chuàng)建一個(gè)會(huì)話時(shí),用戶的在線信息被存放到服務(wù)器的好友列表管理器中。當(dāng)在線狀態(tài)改變時(shí),〈Presence/〉包將被服務(wù)器處理,服務(wù)器在好友名單中進(jìn)行查詢,并將在線信息狀態(tài)包發(fā)送給所有訂閱用戶在線狀態(tài)的實(shí)體。在用戶成功登錄到XMPP服務(wù)器之后,默認(rèn)狀態(tài)顯示為在線。但是用戶可以根據(jù)自己的需要來改變自己的狀態(tài),并且立即通知好友列表中的每一個(gè)聯(lián)系人。此時(shí)只需客戶端向服務(wù)器發(fā)送改變狀態(tài)的通知,內(nèi)容可以為忙,暫時(shí)離開或者其它用戶想要顯示的信息。 這時(shí)服務(wù)器便會(huì)向該用戶的好友列表的成員發(fā)送載有相應(yīng)信息的XML流。圖7是客戶端好友上線通知流程圖,由其可知,好友上線狀態(tài)被處理后通過服務(wù)器在用戶端顯示的整個(gè)流程。當(dāng)用戶登錄到服務(wù)器端的時(shí)候,應(yīng)當(dāng)通知其所有的好友。在花名冊(cè)服務(wù)中服務(wù)器端己經(jīng)獲得了登錄用戶的好友列表,因此服務(wù)器端此時(shí)可以根據(jù)其好友列表產(chǎn)生相應(yīng)的通知并以XML流形式發(fā)送。以下為實(shí)現(xiàn)流程(客戶端已經(jīng)成功與服務(wù)器建立連接)
步驟01 :客戶端向服務(wù)器好友名冊(cè)中申請(qǐng)獲取好友名單;
步驟02 :服務(wù)器判斷好友是否在線,若在線,則產(chǎn)生好友上線的通知XML流發(fā)送給登錄用戶并告知各位好友用戶登錄的狀態(tài),轉(zhuǎn)向04 ;
步驟03 :若不在線,則查詢好名名單的下一位好友,轉(zhuǎn)向02 ;
步驟04 :結(jié)束該功能。圖8是客戶端獲取并顯示好友列表流程圖,由其可知,好友列表數(shù)據(jù)通過服務(wù)器處理并在用戶端顯示的整個(gè)流程。好友列表功能的實(shí)現(xiàn)是在用戶登錄到服務(wù)器上之后立即發(fā)生的服務(wù),該項(xiàng)功能的目的在于通過查詢得到自己的好友名冊(cè)列表,服務(wù)器以登錄用戶的JID為參數(shù)在好友列表查找其好友的JID。然后再根據(jù)查詢數(shù)據(jù)庫得到的好友信息結(jié)果中的好友JID,查詢他們的在線狀態(tài),然后將這些信息組合成XMPP協(xié)議的XML流返回給用戶,用戶將好友及其狀態(tài)列表在客戶端顯示出來。
以下為好友列表獲取及顯示的流程(客戶端已經(jīng)成功與服務(wù)器建立連接)
步驟01 :客戶端向服務(wù)器提出查詢好友列表請(qǐng)求;
步驟02 :服務(wù)器響應(yīng)請(qǐng)求并將好友列表以XML流發(fā)送給登錄用戶;
步驟03 :客戶端顯示好友列表;
步驟04 :結(jié)束該功能。圖9是客戶端添加好友流程圖,由其可知,用戶在客戶端界面添加好友時(shí),數(shù)據(jù)從客戶端到服務(wù)器以及從服務(wù)器到客戶端被處理的整個(gè)流程。添加好友功能是該系統(tǒng)的ー項(xiàng)非常重要的功能,用戶可以隨意地添加新的好友。以下為添加好友流程
步驟01 :客戶端前端向服務(wù)器發(fā)出添加好友的請(qǐng)求;
步驟02 :客戶端的協(xié)議解析模塊解析出要添加的好友的JID ;
步驟03 :客戶端在本地捜索要添加的好友是否存在,若存在,則返回前端提示該用戶已是好友,無需添加,轉(zhuǎn)向步驟06;若不存在,則通過底層通信模塊向服務(wù)器請(qǐng)求,通過服務(wù)器的數(shù)據(jù)訪問模塊以JID為條件在數(shù)據(jù)庫中的用戶表中查找該好友;
步驟04 :若數(shù)據(jù)庫中好友存在,則服務(wù)器端將結(jié)果返回給客戶端,并將JID插入到好友列表中,通過底層通信模塊,返回包含有該好友的信息的XML,提示添加好友成功,轉(zhuǎn)向步驟六;
步驟05 :若數(shù)據(jù)庫中好友不存在,則向客戶端返回添加失敗的XML流,提示不存在此用
戶;
步驟06 :結(jié)束添加好友功能。圖10是客戶端刪除好友流程圖,由其可知,用戶在客戶端界面刪除好友時(shí),數(shù)據(jù)從客戶端到服務(wù)器以及從服務(wù)器到客戶端被處理的整個(gè)流程。刪除好友也是該系統(tǒng)的ー項(xiàng)重要的功能,其作用是刪除好友列表的某一用戶。以下為刪除好友流程
步驟01 :客戶端前端向服務(wù)器發(fā)出刪除好友的請(qǐng)求;
步驟02 :服務(wù)器在收到客戶端發(fā)來的請(qǐng)求之后,通過協(xié)議解析模塊解析XML流,并獲取需要?jiǎng)h除的好友的JID;
步驟03 :服務(wù)器通過數(shù)據(jù)庫訪問模塊在數(shù)據(jù)庫的好友列表中查詢?cè)撚脩?,并將其刪
除;
步驟04 :若刪除成功,則向客戶端返回相應(yīng)的XML流,提示客戶端好友刪除成功,轉(zhuǎn)向步驟六;
步驟05 :若刪除失敗,則向客戶端返回相應(yīng)的XML流,提示客戶端刪除失??;
步驟06:刪除好友操作結(jié)束。會(huì)話功能客戶端為用戶提供了相互會(huì)話的功能,即相互發(fā)送即時(shí)消息,該功能是即時(shí)消息系統(tǒng)的最基本的功能。會(huì)話功能模塊將客戶端界面輸入的文字消息解析為XMPP 的〈message/〉消息節(jié)后,通過底層通信模塊將消息發(fā)送到服務(wù)器,同時(shí)持續(xù)監(jiān)聽來自服務(wù)器的〈message/〉消息節(jié),當(dāng)接收到〈message/〉消息節(jié)之后,將〈message/〉消息轉(zhuǎn)換為文字消息顯示到聊天室的界面中。本項(xiàng)目中的即時(shí)消息系統(tǒng)有三種會(huì)話方式第一種為連接在同一個(gè)XMPP服務(wù)器上的兩個(gè)用戶之間的會(huì)話;第二種為連接在不同XMPP服務(wù)器上的兩個(gè)用戶之間的會(huì)話;第三種為XMPP系統(tǒng)的用戶和非XMPP系統(tǒng)的用戶之間的會(huì)話,會(huì)話是在聊天室中進(jìn)行的。會(huì)話功能模塊中需要包括四個(gè)功能的實(shí)現(xiàn)用以滿足用戶的需求,即初始化聊天室、發(fā)送即時(shí)消息、接收即時(shí)消息和聊天室管理器。圖11是客戶端發(fā)送消息流程圖,由其可知,用戶在客戶端界面輸入消息并且發(fā)送時(shí),數(shù)據(jù)從客戶端到服務(wù)器以及從服務(wù)器到客戶端被處理的整個(gè)流程。圖12是客戶端接收消息流程圖,由其可知,用戶在客戶端界面接收消息并且顯示時(shí),數(shù)據(jù)從好友客戶端到服務(wù)器以及從服務(wù)器到用戶客戶端被處理的整個(gè)流程。客戶端與服務(wù)器之間會(huì)話的步驟為
步驟01 :源客戶端通過底層通信功能模塊向XMPP I服務(wù)器發(fā)送建立會(huì)話的請(qǐng)求; 步驟02 =XMPP服務(wù)器I在收到源客戶端的請(qǐng)求之后通過TLS,SASL進(jìn)行安全、身份驗(yàn)證,若通過,則向源客戶端返回確認(rèn)建立連接的響應(yīng);
步驟03 :源客戶端通過協(xié)議解析功能模塊獲取客戶端界面的消息并將其封裝成XMPP 數(shù)據(jù)包,然后通過底層通信功能模塊向XMPP服務(wù)器發(fā)送會(huì)話內(nèi)容;
步驟04 =XMPP服務(wù)器I通過協(xié)議解析模塊進(jìn)行XMPP數(shù)據(jù)包解析,獲取數(shù)據(jù)包中目的客戶端的JID,通過數(shù)據(jù)庫訪問模塊查詢數(shù)據(jù)庫。步驟05 :若目的客戶端在本地服務(wù)器中,并且在線,則直接將數(shù)據(jù)包轉(zhuǎn)發(fā)給目的客戶端,轉(zhuǎn)向步驟十六;
步驟06 :若目的客戶端不在線,則將XMPP數(shù)據(jù)包通過數(shù)據(jù)庫訪問模塊將XMPP數(shù)據(jù)包存入XMPP服務(wù)器I的數(shù)據(jù)庫,待目的客戶端上線后進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā);
步驟07 :若目的客戶端不在本地服務(wù)器中,轉(zhuǎn)向步驟八和步驟十五;
步驟08 :若目的客戶端不在本地服務(wù)器中,則服務(wù)器向DNS服務(wù)器發(fā)送申請(qǐng)解析域名的請(qǐng)求;
步驟09 =DNS服務(wù)器搜索目的客戶端所在的XMPP服務(wù)器2是否存在,同時(shí)向XMPP服務(wù)器I返回解析后的域名;
步驟10 =XMPP服務(wù)器I通過TCP三次握手、TLS、SASL以及服務(wù)器回?fù)芄δ苓M(jìn)行安全、 驗(yàn)證向XMPP服務(wù)器2發(fā)送連接請(qǐng)求;
步驟11 =XMPP服務(wù)器2通過底層通信模塊向XMPP服務(wù)器I發(fā)送請(qǐng)求響應(yīng),若目的客戶端在線狀態(tài),則建立二者之間的連接,轉(zhuǎn)向步驟十三;
步驟12 :若目的客戶端不在線,則將XMPP數(shù)據(jù)包存入XMPP服務(wù)器I的數(shù)據(jù)庫中,待目的客戶端上線后再將該信息轉(zhuǎn)發(fā);
步驟13 =XMPP服務(wù)器I向XMPP服務(wù)器2轉(zhuǎn)發(fā)由源客戶端發(fā)送的XMPP數(shù)據(jù)包;
步驟14 =XMPP服務(wù)器2直接將XMPP數(shù)據(jù)包轉(zhuǎn)發(fā)到目的客戶端,轉(zhuǎn)向步驟十六;
步驟15 :源客戶端通過協(xié)議解析模塊獲取XMPP數(shù)據(jù)包之后,通過協(xié)議網(wǎng)關(guān),將數(shù)據(jù)包發(fā)送到非XMPP系統(tǒng)的服務(wù)器,再由非XMPP系統(tǒng)的服務(wù)器將數(shù)據(jù)包轉(zhuǎn)發(fā)到非XMPP系統(tǒng)的客戶端;
步驟16 :會(huì)話結(jié)束,關(guān)閉連接。圖13是客戶端文件傳輸流程圖,由其可知,用戶在客戶端界面?zhèn)鬏斘募?,文件從用戶客戶端到服?wù)器以及從服務(wù)器到好友客戶端被處理的整個(gè)流程。
步驟01 :源客戶端向XMPP服務(wù)器發(fā)送向目的客戶端傳輸文件的請(qǐng)求;
步驟02 =XMPP服務(wù)器通過數(shù)據(jù)訪問模塊訪問數(shù)據(jù)庫判斷目的客戶端是否屬于本地服務(wù)器,若是,則判斷目的客戶端是否在線,若在線,則向目的客戶端發(fā)送源客戶端文件傳輸?shù)恼?qǐng)求,井向源客戶端返回目的客戶端的JID,轉(zhuǎn)向步驟五;
步驟03 :若不屬于本地服務(wù)器,則若不在,則將請(qǐng)求轉(zhuǎn)向代理服務(wù)器,轉(zhuǎn)向步驟七; 步驟04 :若不在線,則將傳輸文件請(qǐng)求存放在服務(wù)器的緩沖區(qū),等目的客戶端在線時(shí), 直接從緩沖區(qū)提取文件并轉(zhuǎn)發(fā)給目的客戶端,轉(zhuǎn)向步驟十四;
步驟05 目的客戶端響應(yīng)XMPP服務(wù)器傳輸文件的請(qǐng)求,XMPP服務(wù)器將響應(yīng)發(fā)送給源客戶端;
步驟06 :源客戶端向XMPP服務(wù)器傳輸文件,XMPP服務(wù)器直接將文件轉(zhuǎn)發(fā)給目的客戶端,轉(zhuǎn)向步驟十四;
步驟07 目的客戶端為代理服務(wù)器打開ー個(gè)TCP socket連接;
步驟08 :代理服務(wù)器通過SOCKS 5與目的客戶端建立連接,設(shè)定目標(biāo)地址和目標(biāo)端ロ 參數(shù)的值;
步驟09 :代理服務(wù)器通過SOCKS 5發(fā)送連接成功并確認(rèn)至源的客戶端;
步驟10 :源客戶端為代理服務(wù)器打開ー個(gè)TCPsocket連接;
步驟11 :源客戶端通過SOCKS 5向代理服務(wù)器請(qǐng)求建立連接,設(shè)定目標(biāo)地址和目標(biāo)端 ロ參數(shù)的值;
步驟12 :若成功建立連接,源客戶端通過SOCKS 5發(fā)送連接成功確認(rèn)至目的客戶端
端;
步驟13 :源客戶端和目的客戶端通過SOCKS 5代理服務(wù)器,再由SOCKS 5服務(wù)器轉(zhuǎn)發(fā)給XMPP服務(wù)器可以成功實(shí)現(xiàn)文件的傳輸;
步驟14 :文件成功傳輸之后,關(guān)閉源客戶端和目的客戶端之間的連接。圖14是頂系統(tǒng)互相通信圖,由其可知,XMPP系統(tǒng)與非XMPP系統(tǒng)之間數(shù)據(jù)通信。XMPP系統(tǒng)的客戶端發(fā)送消息給非XMPP系統(tǒng)的客戶端,首先指明ー個(gè)包含非XMPP 系統(tǒng)名的JID,而不是直接發(fā)送給外部頂系統(tǒng)上的用戶。其次,XMPP服務(wù)器將數(shù)據(jù)發(fā)送到指定的傳輸器應(yīng)用程序,如果傳輸器是本地的,則XMPP服務(wù)器直接與其進(jìn)行通信;如果傳輸器不在本地運(yùn)行,本地服務(wù)器發(fā)送ー個(gè)包給遠(yuǎn)程服務(wù)器,該遠(yuǎn)程服務(wù)器將會(huì)把包發(fā)送給指定的傳輸器。一旦傳輸器接收到XML包,它把信息“轉(zhuǎn)變”成另ー個(gè)IM網(wǎng)絡(luò)中可以識(shí)別的本地包,并把這個(gè)本地包傳送到那個(gè)頂網(wǎng)絡(luò)中。本發(fā)明公開了ー種基于XMPP協(xié)議的即時(shí)消息傳輸方法,使用開源的Openfire作為服務(wù)器,以Spark作為客戶端的主要框架,采用Java語言,Smack客戶端庫編寫ー個(gè)基于 XMPP協(xié)議的客戶端,以Xampp軟件中的MySQL作為數(shù)據(jù)庫,采用XMPP技術(shù)、SOCKS技術(shù)、數(shù)據(jù)庫技術(shù)和套接字技術(shù),成功實(shí)現(xiàn)企業(yè)內(nèi)部以及企業(yè)外部的即時(shí)消息之間的數(shù)據(jù)傳輸。本發(fā)明不僅能很好的滿足用戶的基本需求、管理需求與功能性需求外,還能達(dá)到較高的安全性,可擴(kuò)展性,實(shí)現(xiàn)與其他即時(shí)通信系統(tǒng)的互聯(lián)互通。在實(shí)現(xiàn)企業(yè)內(nèi)部的功能時(shí),采用不改變?cè)蟹?wù)器和客戶端基礎(chǔ)架構(gòu)的條件下, 利用插件的方式成功實(shí)現(xiàn)功能的擴(kuò)展。通過利用網(wǎng)關(guān)來成功實(shí)現(xiàn)企業(yè)內(nèi)部服務(wù)器與其它頂服務(wù)器之間的數(shù)據(jù)通信。
綜上所述,本發(fā)明內(nèi)容主要包括以下三方面
I.采用Java程序設(shè)計(jì)語言,完成本系統(tǒng)中客戶端在Eclipse平臺(tái)中的設(shè)計(jì)與實(shí)現(xiàn)??蛻舳酥饕歉鶕?jù)企業(yè)自身特點(diǎn),向用戶提供實(shí)時(shí)信息交換。其開發(fā)包括前端界面的設(shè)計(jì)和實(shí)現(xiàn)和后端數(shù)據(jù)平臺(tái)功能模塊的設(shè)計(jì)與實(shí)現(xiàn),而功能主要包括用戶的注冊(cè)、用戶登錄功能、好友列表管理(包括狀態(tài)的顯示和更改、添加用戶、刪除用戶和搜索好友)、個(gè)人名片管理、會(huì)話功能、文件傳輸功能和與其他IM通信功能等。2.完成本系統(tǒng)中服務(wù)器在Eclipse中的成功部署和運(yùn)行。實(shí)現(xiàn)本系統(tǒng)中服務(wù)器和客戶端之間以及客戶端之間的互相通信。包括客戶端和服務(wù)器之間的連接,數(shù)據(jù)的通信,用戶的添加、存儲(chǔ)、查詢、更新和刪除,用戶狀態(tài)的設(shè)置,好友狀態(tài)的獲取,注銷等功能。3.完成本系統(tǒng)中的服務(wù)器向其他各種IM服務(wù)器(例如微軟的MSN服務(wù)器,Google 的Gtalk服務(wù)器等)的連接,用戶狀態(tài)設(shè)置,好友狀態(tài)獲取,數(shù)據(jù)通信,注銷等功能。本發(fā)明的目標(biāo)是實(shí)現(xiàn)在企業(yè)內(nèi)部web客戶端之間以及本服務(wù)器與其它頂服務(wù)器之間的信息交互。首先在客戶端的個(gè)人信息中注冊(cè)用戶的號(hào)碼,并進(jìn)行驗(yàn)證,然后實(shí)現(xiàn)用戶登錄。用戶的狀態(tài)分為在線、忙碌、離開,當(dāng)用戶狀態(tài)發(fā)生變化時(shí),客戶端能成功顯示。其次,企業(yè)內(nèi)部服務(wù)器與客戶端之間,客戶端與客戶端之間實(shí)現(xiàn)信息交互;
再次,在企業(yè)內(nèi)部的客戶端登錄頁面輸入其他IM系統(tǒng)的用戶帳號(hào),驗(yàn)證成功后登錄到其他頂服務(wù)器并與之進(jìn)行信息交互。
權(quán)利要求
1. 一種基于XMPP協(xié)議的即時(shí)消息傳輸方法,其特征在于使用開源的Openfire作為服務(wù)器,以Spark客戶端作為主要框架,以MySQL作為數(shù)據(jù)庫,采用XMPP技術(shù)、SOCKS技術(shù)、 數(shù)據(jù)庫技術(shù),套接字技術(shù)和網(wǎng)關(guān)技術(shù),在Smack客戶端庫建立一個(gè)基于XMPP協(xié)議的客戶端, 實(shí)現(xiàn)企業(yè)內(nèi)部以及企業(yè)外部的即時(shí)消息之間的數(shù)據(jù)傳輸;其中所述基于XMPP協(xié)議的客戶端進(jìn)行數(shù)據(jù)傳輸?shù)倪^程如下A、實(shí)現(xiàn)用戶注冊(cè)功能步驟Al :采用用戶注冊(cè)模塊初始化注冊(cè)界面;用戶在注冊(cè)界面中輸入用戶名、密碼、確認(rèn)密碼和服務(wù)器的IP,將上述信息發(fā)送至用戶注冊(cè)模塊;步驟A2 :用戶注冊(cè)模塊驗(yàn)證用戶輸入信息是否有效;當(dāng)用戶輸入的數(shù)據(jù)無誤,則繼續(xù)下一步驟;步驟A3 :讀取服務(wù)器主機(jī)名和端口號(hào);客戶端通過協(xié)議解析模塊將用戶注冊(cè)信息轉(zhuǎn)換為XMPP請(qǐng)求數(shù)據(jù);步驟A4 :客戶端通過底層通信模塊與服務(wù)器建立連接,向服務(wù)器發(fā)送用戶注冊(cè)請(qǐng)求; 步驟A5 :通過底層通信模塊監(jiān)聽來自服務(wù)器的響應(yīng),客戶端啟動(dòng)監(jiān)聽時(shí)延;步驟A6 :判斷在時(shí)延內(nèi)客戶端是否收到來自服務(wù)器的響應(yīng),若收到響應(yīng),進(jìn)一步判定該響應(yīng)是否有誤;若沒有錯(cuò)誤,則協(xié)議解析模塊處理響應(yīng),并在客戶端界面顯示用戶注冊(cè)成功,結(jié)束用戶注冊(cè)操作;若響應(yīng)有誤,則客戶端界面顯示用戶注冊(cè)失敗,結(jié)束用戶注冊(cè)操作;B、實(shí)現(xiàn)用戶登錄功能步驟BI :啟動(dòng)客戶端登陸界面后,采用用戶登錄模塊進(jìn)行初始化工作;步驟B2 :用戶在客戶端的用戶登錄界面輸入用戶名、密碼和服務(wù)器的IP,將上述信息發(fā)送至用戶登錄模塊;步驟B3 :用戶登錄模塊獲取輸入信息,然后讀取服務(wù)器的主機(jī)名和密碼;步驟B4 :通過客戶端后臺(tái)的協(xié)議解析模塊將登錄信息解析為XMPP數(shù)據(jù)請(qǐng)求包;步驟B5 :通過底層通信模塊與服務(wù)器建立連接,向服務(wù)器發(fā)送用戶登錄請(qǐng)求;步驟B6 :客戶端創(chuàng)建新的監(jiān)聽,并設(shè)立時(shí)延;步驟B7 :判斷在時(shí)延內(nèi)客戶端是否收到來自服務(wù)器的響應(yīng),若收到,進(jìn)一步判斷該響應(yīng)是否有誤,若沒有錯(cuò)誤,則協(xié)議解析模塊處理響應(yīng),并在客戶端界面顯示用戶登錄成功, 結(jié)束用戶登錄操作;若響應(yīng)有誤,則客戶端界面顯示用戶登錄失敗,結(jié)束用戶登錄操作;C、實(shí)現(xiàn)狀態(tài)訂閱功能步驟Cl :客戶端與服務(wù)器建立連接;步驟C2 :客戶端向服務(wù)器申請(qǐng)獲取好友名冊(cè)中好友名單;步驟C3 :服務(wù)器判斷好友名單中的第一個(gè)好友是否在線,若在線,則產(chǎn)生該好友上線的通知XML流發(fā)送給登錄用戶并告知該好友用戶登錄的狀態(tài),若不在線,繼續(xù)判斷第二個(gè)好友是否在線,依次類推,直至查詢完好友名單中的所有好友;D、實(shí)現(xiàn)好友名冊(cè)管理功能步驟Dl :客戶端與服務(wù)器建立連接;步驟D2 :客戶端向服務(wù)器提出查詢好友列表請(qǐng)求;步驟D3 :服務(wù)器響應(yīng)請(qǐng)求并以登錄用戶的JID為參數(shù)在好友列表查找其好友的JID,然后再根據(jù)查詢數(shù)據(jù)庫得到的好友信息結(jié)果中的好友JID,查詢他們的在線狀態(tài),然后將這些信息組合成XMPP協(xié)議的XML流返回給登錄用戶;步驟D4 :客戶端顯示好友列表;E、實(shí)現(xiàn)添加好友功能步驟El :客戶端前端向服務(wù)器發(fā)出添加好友的請(qǐng)求;步驟E2 :客戶端的協(xié)議解析模塊解析出要添加的好友的JID ;步驟E3 :客戶端在本地搜索要添加的好友是否存在,若存在,則返回前端提示該用戶已是好友,無需添加,結(jié)束操作;若不存在,則通過底層通信模塊向服務(wù)器請(qǐng)求,通過服務(wù)器的數(shù)據(jù)訪問模塊以JID為條件在數(shù)據(jù)庫中的用戶表中查找該好友;步驟E4 :若數(shù)據(jù)庫中的用戶表中存在該好友,則服務(wù)器端將結(jié)果返回給客戶端,并將所述JID插入到好友列表中,通過底層通信模塊,返回包含有該好友的信息的XML,提示添加好友成功,結(jié)束操作;步驟E5:若數(shù)據(jù)庫中的用戶表中不存在該好友,則向客戶端返回添加失敗的XML流,提示不存在此用戶;F、實(shí)現(xiàn)刪除好友功能步驟Fl :客戶端前端向服務(wù)器發(fā)出刪除好友的請(qǐng)求;步驟F2 :服務(wù)器在收到客戶端發(fā)來的請(qǐng)求之后,通過協(xié)議解析模塊解析XML流,并獲取需要?jiǎng)h除的好友的JID;步驟F3 :服務(wù)器通過數(shù)據(jù)庫訪問模塊在數(shù)據(jù)庫的好友列表中查詢?cè)撚脩?,并將其刪除;步驟F4 :若刪除成功,則向客戶端返回相應(yīng)的XML流,提示客戶端好友刪除成功,結(jié)束操作;步驟F5 :若刪除失敗,則向客戶端返回相應(yīng)的XML流,提示客戶端刪除失??;G、實(shí)現(xiàn)客戶端與服務(wù)器之間的會(huì)話功能步驟Gl :源客戶端通過底層通信功能模塊向第一 XMPP服務(wù)器發(fā)送建立會(huì)話的請(qǐng)求; 步驟G2 :第一 XMPP服務(wù)器在收到源客戶端的請(qǐng)求之后通過TLS,SASL進(jìn)行安全、身份驗(yàn)證,若通過,則向源客戶端返回確認(rèn)建立連接的響應(yīng);步驟G3 :源客戶端通過協(xié)議解析功能模塊獲取客戶端界面的消息并將其封裝成XMPP 數(shù)據(jù)包,然后通過底層通信功能模塊向XMPP服務(wù)器發(fā)送會(huì)話內(nèi)容;步驟G4 :第一 XMPP服務(wù)器通過協(xié)議解析模塊進(jìn)行XMPP數(shù)據(jù)包解析,獲取數(shù)據(jù)包中目的客戶端的JID,通過數(shù)據(jù)庫訪問模塊查詢數(shù)據(jù)庫;步驟G5 :若目的客戶端在本地服務(wù)器中,并且目的客戶端在線,則直接將數(shù)據(jù)包轉(zhuǎn)發(fā)給目的客戶端,結(jié)束會(huì)話并關(guān)閉連接;若目的客戶端不在線,則將XMPP數(shù)據(jù)包通過數(shù)據(jù)庫訪問模塊將XMPP數(shù)據(jù)包存入第一 XMPP服務(wù)器的數(shù)據(jù)庫,待目的客戶端上線后進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā);步驟G6 :若目的客戶端不在本地服務(wù)器中,則服務(wù)器向DNS服務(wù)器發(fā)送申請(qǐng)解析域名的請(qǐng)求;步驟G7 :采用DNS服務(wù)器搜索目的客戶端所在的第二 XMPP服務(wù)器,同時(shí)向第一 XMPP服務(wù)器返回解析后的域名;步驟G8 :第一 XMPP服務(wù)器通過TCP三次握手、TLS、SASL以及服務(wù)器回?fù)芄δ苓M(jìn)行安全、身份驗(yàn)證,向第二 XMPP服務(wù)器發(fā)送連接請(qǐng)求;步驟G911 :第二 XMPP服務(wù)器通過底層通信模塊向第一 XMPP服務(wù)器發(fā)送請(qǐng)求響應(yīng),若目的客戶端在線狀態(tài),則建立二者之間的連接,轉(zhuǎn)向步驟GlO ;若目的客戶端不在線,則將 XMPP數(shù)據(jù)包存入第一 XMPP服務(wù)器的數(shù)據(jù)庫中,待目的客戶端上線后再將該信息轉(zhuǎn)發(fā);步驟GlO :第一 XMPP服務(wù)器向第二 XMPP服務(wù)器轉(zhuǎn)發(fā)由源客戶端發(fā)送的XMPP數(shù)據(jù)包; 步驟Gll :第二 XMPP服務(wù)器直接將XMPP數(shù)據(jù)包轉(zhuǎn)發(fā)到目的客戶端,結(jié)束會(huì)話并關(guān)閉連接;步驟G12 :源客戶端通過協(xié)議解析模塊獲取XMPP數(shù)據(jù)包之后,通過協(xié)議網(wǎng)關(guān),將數(shù)據(jù)包發(fā)送到非XMPP系統(tǒng)的服務(wù)器,再由非XMPP系統(tǒng)的服務(wù)器將數(shù)據(jù)包轉(zhuǎn)發(fā)到非XMPP系統(tǒng)的客戶端;H、實(shí)現(xiàn)文件傳輸功能步驟Hl :源客戶端向XMPP服務(wù)器發(fā)送向目的客戶端傳輸文件的請(qǐng)求;步驟H2 =XMPP服務(wù)器通過數(shù)據(jù)訪問模塊訪問數(shù)據(jù)庫判斷目的客戶端是否屬于本地服務(wù)器,若目的客戶端不屬于本地服務(wù)器,則將請(qǐng)求轉(zhuǎn)向代理服務(wù)器,轉(zhuǎn)向步驟H5 ;若目的客戶端屬于本地服務(wù)器,則判斷目的客戶端是否在線若在線,則向目的客戶端發(fā)送源客戶端文件傳輸?shù)恼?qǐng)求,并向源客戶端返回目的客戶端的JID,轉(zhuǎn)向步驟H3 ;若不在線,則將傳輸文件請(qǐng)求存放在服務(wù)器的緩沖區(qū),等目的客戶端在線時(shí),直接從緩沖區(qū)提取文件并轉(zhuǎn)發(fā)給目的客戶端,轉(zhuǎn)向步驟H12 ;步驟H3 目的客戶端響應(yīng)XMPP服務(wù)器傳輸文件的請(qǐng)求,XMPP服務(wù)器將響應(yīng)發(fā)送給源客戶端;步驟H4 :源客戶端向XMPP服務(wù)器傳輸文件,XMPP服務(wù)器直接將文件轉(zhuǎn)發(fā)給目的客戶端,轉(zhuǎn)向步驟H12 ;步驟H5 目的客戶端為代理服務(wù)器打開一個(gè)TCP socket連接;步驟H6 :代理服務(wù)器通過SOCKS 5與目的客戶端建立連接,設(shè)定目標(biāo)地址和目標(biāo)端口參數(shù)的值;步驟H7 :代理服務(wù)器通過SOCKS 5發(fā)送連接成功并確認(rèn)至源的客戶端;步驟HS :源客戶端為代理服務(wù)器打開一個(gè)TCPsocket連接;步驟H9 :源客戶端通過SOCKS 5向代理服務(wù)器請(qǐng)求建立連接,設(shè)定目標(biāo)地址和目標(biāo)端口參數(shù)的值;步驟HlO :若成功建立連接,源客戶端通過SOCKS 5發(fā)送連接成功確認(rèn)至目的客戶端端;步驟Hll :源客戶端和目的客戶端通過SOCKS 5代理服務(wù)器,再由SOCKS 5服務(wù)器轉(zhuǎn)發(fā)給XMPP服務(wù)器可以成功實(shí)現(xiàn)文件的傳輸;步驟H12 :文件成功傳輸之后,關(guān)閉源客戶端和目的客戶端之間的連接;I、實(shí)現(xiàn)頂互相通信功能XMPP系統(tǒng)的客戶端發(fā)送消息給非XMPP系統(tǒng)的客戶端, 首先指明一個(gè)包含非XMPP系統(tǒng)名的JID ;其次,XMPP服務(wù)器將數(shù)據(jù)發(fā)送到指定的傳輸器應(yīng)用程序,如果傳輸器是本地的,則 XMPP服務(wù)器直接與其進(jìn)行通信;如果傳輸器不在本地運(yùn)行,本地服務(wù)器發(fā)送一個(gè)包給遠(yuǎn)程服務(wù)器,該遠(yuǎn)程服務(wù)器將會(huì)把包發(fā)送給指定的傳輸器;一旦傳輸器接收到XML包,即把信息轉(zhuǎn)變成另一個(gè)IM網(wǎng)絡(luò)中可以識(shí)別的本地包,并把這個(gè)本地包傳送到那個(gè)頂網(wǎng)絡(luò)中。
全文摘要
本發(fā)明公開了一種基于XMPP協(xié)議的即時(shí)消息傳輸方法,使用開源的Openfire作為服務(wù)器,以Spark客戶端作為主要客戶端框架,采用Java語言在Smack客戶端庫編寫一個(gè)基于XMPP協(xié)議的客戶端,以Xampp軟件中的MySQL作為數(shù)據(jù)庫,采用XMPP技術(shù)、SOCKS技術(shù)、數(shù)據(jù)庫技術(shù)和套接字技術(shù),成功實(shí)現(xiàn)企業(yè)內(nèi)部以及企業(yè)外部的即時(shí)消息之間的數(shù)據(jù)傳輸。本發(fā)明不僅能很好的滿足用戶的基本需求、管理需求與功能性需求外,還能達(dá)到較高的安全性,可擴(kuò)展性,實(shí)現(xiàn)與其他即時(shí)通信系統(tǒng)的互聯(lián)互通。
文檔編號(hào)H04L29/06GK102594845SQ20121008719
公開日2012年7月18日 申請(qǐng)日期2012年3月29日 優(yōu)先權(quán)日2012年3月29日
發(fā)明者孫慶慶, 張書強(qiáng), 張毅峰, 朱光輝, 楊洋, 沈彥真, 王開, 王曉姝, 第偉, 繆瑞華, 裴文江, 詹金獅 申請(qǐng)人:東南大學(xué)