程化梅
(武漢郵電科學(xué)研究院 湖北 武漢430000)
基于XMPP的即時(shí)通訊系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
程化梅
(武漢郵電科學(xué)研究院 湖北 武漢430000)
在信息時(shí)代,通訊成為人們?nèi)粘I畋夭豢缮俚闹匾M成部分,而科技的發(fā)展也使我們的通訊方式變得越來(lái)越簡(jiǎn)單和普及,給我們的生活帶來(lái)了巨大的方便。本文首先介紹了XMPP協(xié)議的工作原理,并且說(shuō)明了其優(yōu)勢(shì),然后給出了一套基于XMPP的即時(shí)通訊系統(tǒng)設(shè)計(jì)方案,將其部署在MySql數(shù)據(jù)庫(kù)下,以java為編程語(yǔ)言,實(shí)現(xiàn)了即時(shí)通訊。經(jīng)測(cè)試,本系統(tǒng)實(shí)時(shí)性好、使用方便、穩(wěn)定性好,值得推廣使用。
通訊系統(tǒng);XMPP;Java;數(shù)據(jù)庫(kù)
在這個(gè)快節(jié)奏的時(shí)代,互聯(lián)網(wǎng)對(duì)人們的生活帶來(lái)了極大的便利,人們的交流方式不在局限于面對(duì)面的交談或者周期漫長(zhǎng)的書(shū)信,通信方式越來(lái)越多樣化而且越來(lái)越簡(jiǎn)單。即時(shí)通訊是隨著網(wǎng)絡(luò)技術(shù)的高速發(fā)展而興起的一種新的通訊方式,具有極強(qiáng)的實(shí)時(shí)性、非同步互聯(lián)網(wǎng)通訊作為通信的主流之一性、互動(dòng)性等特點(diǎn)。即時(shí)通訊無(wú)疑是在互聯(lián)網(wǎng)時(shí)代下最流行的通訊方式[1]。主流的即時(shí)通訊例如騰訊QQ、微信等,它們以即時(shí)、可靠、視頻通話、語(yǔ)音通話等特點(diǎn)而大受歡迎。
目前,即時(shí)通訊的應(yīng)用十分普及,不僅有專門的聊天軟件供人們使用。甚至很多主流的手機(jī)APP都引入了即時(shí)通訊的功能,例如新浪微博、百度貼吧的私信,支付寶的聊天功能等。將通訊系統(tǒng)進(jìn)行拓展和引入新的業(yè)務(wù),或者把它嵌入到其它軟件系統(tǒng)中,已成為即時(shí)通訊軟件發(fā)展的新趨勢(shì)。因此,本文設(shè)計(jì)了一個(gè)基于XMPP協(xié)議的即時(shí)通訊系統(tǒng),該系統(tǒng)可以讓用戶之間進(jìn)行實(shí)時(shí)的聊天交流,使用起來(lái)十分簡(jiǎn)單,實(shí)用性很強(qiáng)。
XMPP是一種網(wǎng)絡(luò)即時(shí)通信協(xié)議,它的前身是Jabber協(xié)議。它是一種基于XML的協(xié)議,它繼承了XML協(xié)議的靈活性和擴(kuò)展性。因此,基于XMPP協(xié)議的應(yīng)用也具有極強(qiáng)的可擴(kuò)展性。經(jīng)過(guò)擴(kuò)展以后的XMPP可以通過(guò)發(fā)送擴(kuò)展的信息來(lái)處理用戶的需求。XMPP還包含了針對(duì)服務(wù)器端的軟件協(xié)議,使之能與另一個(gè)進(jìn)行通話,這使得開(kāi)發(fā)者更容易建立客戶應(yīng)用程序或給一個(gè)配好系統(tǒng)添加功能。盡管XMPP并沒(méi)有指定任何特定的網(wǎng)絡(luò)架構(gòu),但通常情況下,它是采用客戶端-服務(wù)器的架構(gòu)進(jìn)行實(shí)現(xiàn),其中客戶端通過(guò)TCP方式使用XMPP訪問(wèn)服務(wù)器,服務(wù)器之間也采用TCP方式進(jìn)行通信。也就是說(shuō)在大多數(shù)情況下,當(dāng)兩個(gè)客戶端進(jìn)行通訊時(shí),它們之間的消息都是通過(guò)服務(wù)器傳遞的。采用這種架構(gòu)的目的,主要是為了簡(jiǎn)化客戶端,將大多數(shù)工作放在服務(wù)器端進(jìn)行,這樣,客戶端的工作就會(huì)簡(jiǎn)單很多。XMPP將復(fù)雜性從客戶端轉(zhuǎn)移到服務(wù)器端。這使得客戶端的程序編寫(xiě)變得非常容易,更新系統(tǒng)功能也同樣變得容易。
XMPP中定義了3種角色:XMPP客戶端,XMPP服務(wù)器和網(wǎng)關(guān)。通信能夠在這三者的任意兩個(gè)之間雙向發(fā)生。服務(wù)器同時(shí)承擔(dān)了客戶端信息記錄、連接管理和信息的路由功能。網(wǎng)關(guān)承擔(dān)著與異構(gòu)即時(shí)通信系統(tǒng)的互聯(lián)互通,異構(gòu)系統(tǒng)可以包括SMS(短信)、MSN、ICQ等。以下是XMPP架構(gòu)的抽象的示意圖(單向箭頭表示使用 XMPP通訊,雙向箭頭表示可使用任何協(xié)議通訊。)如圖1所示,其中Client1,Client2,Clinet3 是 XMPP 客戶端,Sever1,Sever2 是XMPP服務(wù)器,Gateway1是一個(gè)XMPP和外部(非XMPP)消息網(wǎng)絡(luò)之間進(jìn)行 “翻譯”的網(wǎng)關(guān),F(xiàn)oreignNet1是一個(gè)外部消息網(wǎng)絡(luò),F(xiàn)oreignClient1是外部消息網(wǎng)絡(luò)上的一個(gè)客戶端。
圖1 XMPP的網(wǎng)絡(luò)架構(gòu)
XMPP協(xié)議的通訊并非點(diǎn)對(duì)點(diǎn)的通訊,而是客戶端到服務(wù)器再到客戶端的方式,它們之間通信時(shí)傳輸?shù)氖荴ML文件,一個(gè)簡(jiǎn)單的XMPP通訊流程可以歸納為:
1)客戶端連接到服務(wù)器以后,客戶端通過(guò)IO流發(fā)送一段XML文件,文件中包含了客戶端的用戶名和密碼;
2)服務(wù)器接收客戶端發(fā)來(lái)的XML文件,獲取其中的用戶名和密碼并對(duì)其進(jìn)行驗(yàn)證,若驗(yàn)證通過(guò),服務(wù)器會(huì)給客戶端發(fā)送一個(gè)XML文件告知登錄成功;
3)客戶端登錄成功后,會(huì)給服務(wù)器發(fā)送一個(gè)獲取好友名單的XML文件,服務(wù)器會(huì)以XML文件的形式發(fā)送給客戶端好友名單;
4)客戶端可以向任意一個(gè)好友發(fā)送消息,客戶端發(fā)送的信息先發(fā)送到服務(wù)器,服務(wù)器再轉(zhuǎn)發(fā)給好友,好友即可收到。
從目前已有的通訊系統(tǒng)來(lái)看,XMPP作為IM(Instent Messaging)即時(shí)通訊方面的成熟協(xié)議,已被FaceBook、Twitter、網(wǎng)易POPO等知名的通訊工具所應(yīng)用,并且具有非常好的發(fā)展前景[2]。XMPP協(xié)議是自由的、源碼開(kāi)放的。服務(wù)器端有類似OpenFire這樣的開(kāi)源項(xiàng)目,客戶端有smack等基于Java的軟件開(kāi)源協(xié)議包,開(kāi)發(fā)人員可以直接使用這些開(kāi)源工程,在必要時(shí)做一定的修改,這大大的減少了項(xiàng)目的開(kāi)發(fā)難度。
文中研究的是在Android使用XMPP協(xié)議進(jìn)行即時(shí)通信,所涉及3個(gè)主要的東西:OpenFire、Smack和spark,它們結(jié)合起來(lái)就是完整的XMPP即時(shí)通訊系統(tǒng)的實(shí)現(xiàn)[3]。這里簡(jiǎn)單介紹一下它們作用:
OpenFire主要是作為服務(wù)器,管理客戶端的通信連接,并提供客戶端一些通信信息和連接信息。
Smack主要是對(duì)XMPP協(xié)議的實(shí)現(xiàn),它提供了一套API,所有實(shí)現(xiàn)XMPP的操作都是通過(guò)使用Smack的API來(lái)實(shí)現(xiàn),在Android里,使用的是Asmack這個(gè)包,這個(gè)包的作用與與Smack是相同的[4]。
Spark是客戶端的實(shí)現(xiàn),它其實(shí)就是使用了Smack的API實(shí)現(xiàn)的。
它們?nèi)咧g的關(guān)系如圖2所示。
圖2 XMPP通訊系統(tǒng)的關(guān)系圖
在本即時(shí)通訊系統(tǒng)的設(shè)計(jì)中,采用Java語(yǔ)言來(lái)編寫(xiě)項(xiàng)目程序。Java是一門面向?qū)ο蟆⒖缙脚_(tái)的語(yǔ)言,其多線程與網(wǎng)絡(luò)編程機(jī)制是內(nèi)置的,在編寫(xiě)完成后可以運(yùn)行在任何裝有Java虛擬機(jī)的平臺(tái)上,正是因?yàn)樗目缙脚_(tái)性,用Java語(yǔ)言編寫(xiě)的項(xiàng)目也有了更強(qiáng)的可擴(kuò)展性[5]。
2.1 數(shù)據(jù)庫(kù)
即時(shí)通訊系統(tǒng)的數(shù)據(jù)庫(kù)至少要包括的數(shù)據(jù)表有,管理員表、用戶表、聊天記錄表、文件表等。數(shù)據(jù)庫(kù)的數(shù)據(jù)是根據(jù)實(shí)時(shí)的用戶信息而變化的,當(dāng)用戶數(shù)據(jù)發(fā)生了增刪改查時(shí),后臺(tái)也會(huì)對(duì)數(shù)據(jù)庫(kù)里的數(shù)據(jù)做出相應(yīng)的更改,例如新增好友時(shí),用戶的好友表也會(huì)新增一條數(shù)據(jù)。由于Java是通過(guò)JDBC以統(tǒng)一的接口訪問(wèn)和操作各種數(shù)據(jù)庫(kù)系統(tǒng)的,而且支持的數(shù)據(jù)庫(kù)系統(tǒng)種類非常多,MySql、Oracle、SQL Server等主流數(shù)據(jù)庫(kù)應(yīng)用都十分廣泛[6],功能也十分強(qiáng)大,優(yōu)點(diǎn)也各不相同。本系統(tǒng)采用的是MySql數(shù)據(jù)庫(kù),MySql的核心程序采用完全的多線程編程。線程是輕量級(jí)的進(jìn)程,它可以靈活地為用戶提供服務(wù),而不過(guò)多的占用系統(tǒng)資源。
2.2 服務(wù)端
在使用XMPP協(xié)議的即時(shí)通訊系統(tǒng)中,服務(wù)器充當(dāng)?shù)氖荴MPP通信的一個(gè)智能抽象層[7],它主要負(fù)責(zé)對(duì)受驗(yàn)證的客戶端,服務(wù)器以及其他實(shí)體之間以XML流形式的連接和會(huì)話進(jìn)行管理。并在這些實(shí)體之間使用XML流對(duì)合理編址的XML節(jié)進(jìn)行路由管理。大部分XMPP兼容的服務(wù)器也負(fù)責(zé)存儲(chǔ)客戶端使用的數(shù)據(jù)[8](比如基于XMPP協(xié)議的及時(shí)消息中的聯(lián)系人名單),那么此時(shí),XML數(shù)據(jù)直接由服務(wù)器來(lái)處理,而不需要轉(zhuǎn)發(fā)到其他的實(shí)體。
服務(wù)端應(yīng)該包括的主要功能有:賬戶管理(注冊(cè)、登錄、注銷)、好友管理(新增好友、刪除好友)、消息管理等[9]。
下面是完成于Openfire服務(wù)器的連接和設(shè)置一些配置的代碼:
2.3 客戶端
大部分客戶端是通過(guò)TCP連接直接連接到服務(wù)器的[10],并且通過(guò)XMPP獲得由服務(wù)器以及聯(lián)合服務(wù)器所提供的全部功能。多個(gè)不同資源(比如不同的設(shè)備和地點(diǎn))的客戶端可以同時(shí)登陸并且并發(fā)的連接到一個(gè)服務(wù)器[11],每個(gè)不同資源的客戶端通過(guò)XMPP地址的資源標(biāo)識(shí)符來(lái)區(qū)分。XMPP客戶端與服務(wù)端通過(guò)XML在TCP套接字的5222端口進(jìn)行通信,而不需要客戶端之間直接進(jìn)行通信[12]。
客戶端的核心功能包括賬號(hào)管理:注冊(cè)、登陸、退出、用戶信息管理,好友管理:增加、刪除好友、更改昵稱、備注好友,聊天管理:聊天、聊天記錄存儲(chǔ)。做客戶端的賬號(hào)管理部分時(shí),首先最重要的是登錄模塊,登錄的安全性決定了整個(gè)系統(tǒng)的價(jià)值。系統(tǒng)對(duì)登錄的賬號(hào)和密碼做出判斷,只有在本系統(tǒng)上注冊(cè)過(guò)得用戶才可以登錄該通訊系統(tǒng),用戶或者密碼不匹配的用戶無(wú)法進(jìn)行后續(xù)的操作,這保障了該通訊系統(tǒng)的安全性。并且普通用戶登錄后進(jìn)入的界面和管理員的界面是不同的,他們都有各自能使用的功能和權(quán)限[13]。在好友管理模塊,用戶可以對(duì)自己的好友修改備注名,這樣即使用戶的好友們更改了自己的昵稱,或者不同的好友恰好使用了相同的昵稱時(shí),用戶可以根據(jù)自己修改的備注名直接找到自己想聊天的好友,而系統(tǒng)也不需要把用戶昵稱作為用戶的唯一標(biāo)識(shí)了。最后,在聊天管理模塊,用戶點(diǎn)擊一位好友頭像就可以和自己的任何一位好友發(fā)起一個(gè)聊天會(huì)話,他們的聊天記錄也保存在這個(gè)會(huì)話中,這樣一來(lái),用戶和每一位好友的聊天記錄都保存在他們彼此的會(huì)話里,用戶與每位好友的聊天記錄都是單獨(dú)的,當(dāng)其中一方刪除了聊天記錄以后,數(shù)據(jù)庫(kù)的記錄并不會(huì)刪除,所以另一方的聊天記錄也是存在的,這樣聊天管理起來(lái)也會(huì)變得十分簡(jiǎn)單和方便。
如圖3所示是一個(gè)聊天的頁(yè)面。
本次系統(tǒng)測(cè)試從普通用戶和管理員兩個(gè)不同的方面對(duì)所有涉及到的功能模塊進(jìn)行了測(cè)試,以保證順利走通每一個(gè)流程。首先從用戶這一方進(jìn)行測(cè)試,測(cè)試用戶的注冊(cè)登錄功能,確保用戶的權(quán)限安全性,比如注冊(cè)時(shí),后臺(tái)驗(yàn)證該賬號(hào)是否已被注冊(cè),登錄時(shí)后臺(tái)驗(yàn)證賬號(hào)密碼是否匹配,若已經(jīng)登錄則保存在一個(gè)session會(huì)話中[14],在規(guī)定時(shí)間內(nèi)不需要重新登錄。其次就是驗(yàn)證處理信息的準(zhǔn)確性,例如實(shí)時(shí)的收發(fā)消息,根據(jù)賬號(hào)精確找到相應(yīng)用戶來(lái)添加好友、刪除好友時(shí)解除好友關(guān)系以及會(huì)話權(quán)限。其次,從管理員這一方進(jìn)行測(cè)試,測(cè)試管理員的權(quán)限,登錄時(shí)后臺(tái)要判斷是管理員還是普通用戶,管理普通用戶的信息,除了用戶可以更改自己的信息以外,管理員也有權(quán)限更改用戶的一些信息,例如禁止用戶發(fā)言或者禁用用戶的賬號(hào)。最后是對(duì)一些非常規(guī)操作的測(cè)試,用戶甲刪除了好友乙以后,乙的好友列表里也不再有張三這位好友,這樣做的優(yōu)點(diǎn)是,當(dāng)甲刪除乙以后,甲沒(méi)有和乙會(huì)話的權(quán)限,而乙的好友里沒(méi)有甲以后,乙也就無(wú)法向甲發(fā)起一個(gè)會(huì)話,避免了這種無(wú)效會(huì)話的產(chǎn)生。依據(jù)最后的測(cè)試結(jié)果表明,本系統(tǒng)滿足實(shí)時(shí)、方便、安全、穩(wěn)定的特性,達(dá)到了設(shè)計(jì)的目的。
圖3 用戶的聊天記錄截圖
文中主要介紹了一個(gè)基于XMPP協(xié)議的即時(shí)通訊系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn),并從幾個(gè)主要的模塊進(jìn)行了講解。經(jīng)過(guò)系統(tǒng)的測(cè)試證實(shí),本系統(tǒng)可以用于即時(shí)通訊,并且穩(wěn)定性較好,操作方便。同時(shí)由于Java語(yǔ)言面向?qū)ο蟮奶匦?,?dāng)增加或修改功能時(shí),都不需要對(duì)原系統(tǒng)進(jìn)行大量的修改。而XMPP的典型的C/S架構(gòu),簡(jiǎn)化了客戶端,將大多數(shù)工作放在服務(wù)器端進(jìn)行,當(dāng)增加功能時(shí),多數(shù)是在服務(wù)器端進(jìn)行[15]。從而使所開(kāi)發(fā)的軟件結(jié)構(gòu)合理,軟件重用性好、易于維護(hù)與擴(kuò)充。
[1]李銳.淺談即時(shí)通訊工具現(xiàn)狀及其發(fā)展趨勢(shì)[J].中國(guó)科技信息, 2013(16):86.
[2]張逸炎,任品毅,李凡.移動(dòng)終端即時(shí)消息推送系統(tǒng)的應(yīng)用開(kāi)發(fā)[C].第十七屆全國(guó)青年通信學(xué)術(shù)年會(huì)論文集,2012.
[3]李立亞,徐榮,潘曉燕.即時(shí)通信軟件用戶狀態(tài)管理策略與方法[J].電腦編程技巧與維護(hù),2011(10):96-98.
[4]白鶴,歐陽(yáng)峰,趙明,等.基于Jabber/XMPP擴(kuò)展協(xié)議的文件共享發(fā)布系統(tǒng) [J].廣播與電視技術(shù).2012(5):15,44-47.
[5]張藝.基于WebSocket的即時(shí)通信系統(tǒng)研究與實(shí)現(xiàn)[J].軟件, 2015(3):89-94.
[6]張建平.基于Android校園即時(shí)信息系統(tǒng)研究[J].電子設(shè)計(jì)工程,2013(20):117-120.
[7]黃偉敏.基于XMPP協(xié)議的Android即時(shí)通信系統(tǒng)設(shè)計(jì)[J].電子設(shè)計(jì)工程,2011(8):57-59.
[8]錢海鋼.基于即時(shí)通信技術(shù)的圖書(shū)預(yù)約系統(tǒng)[J].科技情報(bào)開(kāi)發(fā)與經(jīng)濟(jì),2013(16):18-21.
[9]林妍.局域網(wǎng)內(nèi)即時(shí)通訊系統(tǒng)的設(shè)計(jì) [J].中國(guó)新通信, 2013(12):8,13.
[10]李光明.應(yīng)用SOCKET實(shí)現(xiàn)網(wǎng)絡(luò)通信[J].煤炭技術(shù), 2012(3):88-90.
[11]謝智明.JAVA語(yǔ)言SOCKET機(jī)制的研究[J].湖南科技學(xué)院學(xué)報(bào), 2011(4):70-72.
[12]諶頏.一種多功能網(wǎng)絡(luò)即時(shí)通訊系統(tǒng)的設(shè)計(jì)[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用, 2014(11):62,65.
[13]鐘桂鳳.基于Android平臺(tái)的食譜資訊管理系統(tǒng)的分析設(shè)計(jì)[J].技術(shù)與市場(chǎng), 2014(12):34-35,38.
[14]張沖,劉涌,楊海波,等.移動(dòng)社交網(wǎng)絡(luò)實(shí)時(shí)通信機(jī)制的研究[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2014(2):205-208.
[15]李新路.XMPP協(xié)議在Android即時(shí)通訊系統(tǒng)中的應(yīng)用[J].電腦知識(shí)與技術(shù),2013(28):6268-6270.
Design and implementation of instant communication system based on XMPP
CHENG Hua-mei
(Wuhan Research Institute of Posts and Telecommunications,Wuhan 430000,China)
In information age,communication has became a necessary part of our life,however the development of technology makes our ways of communication easier and universal,the Internet as one ofthe most popular communications has brought great convenience to our life.This paper at first introduces the principle of XMPP protocol,and gives a design of instant communication based on XMPP, deploys it in MySQL database, with java programming language, and achieve instant messaging.Through the test , it is concluded that the system has the feature of real-time, easy to use, good stability,and should be introduced.
communication system;XMPP;Java;database
TN914
:A
:1674-6236(2017)15-0162-04
2016-08-04稿件編號(hào):201608030
程化梅(1991—),女,湖北天門人,碩士研究生。研究方向:通信與信息系統(tǒng)、互聯(lián)網(wǎng)。