程化梅
(武漢郵電科學研究院 湖北 武漢430000)
基于XMPP的即時通訊系統的設計與實現
程化梅
(武漢郵電科學研究院 湖北 武漢430000)
在信息時代,通訊成為人們日常生活必不可少的重要組成部分,而科技的發展也使我們的通訊方式變得越來越簡單和普及,給我們的生活帶來了巨大的方便。本文首先介紹了XMPP協議的工作原理,并且說明了其優勢,然后給出了一套基于XMPP的即時通訊系統設計方案,將其部署在MySql數據庫下,以java為編程語言,實現了即時通訊。經測試,本系統實時性好、使用方便、穩定性好,值得推廣使用。
通訊系統;XMPP;Java;數據庫
在這個快節奏的時代,互聯網對人們的生活帶來了極大的便利,人們的交流方式不在局限于面對面的交談或者周期漫長的書信,通信方式越來越多樣化而且越來越簡單。即時通訊是隨著網絡技術的高速發展而興起的一種新的通訊方式,具有極強的實時性、非同步互聯網通訊作為通信的主流之一性、互動性等特點。即時通訊無疑是在互聯網時代下最流行的通訊方式[1]。主流的即時通訊例如騰訊QQ、微信等,它們以即時、可靠、視頻通話、語音通話等特點而大受歡迎。
目前,即時通訊的應用十分普及,不僅有專門的聊天軟件供人們使用。甚至很多主流的手機APP都引入了即時通訊的功能,例如新浪微博、百度貼吧的私信,支付寶的聊天功能等。將通訊系統進行拓展和引入新的業務,或者把它嵌入到其它軟件系統中,已成為即時通訊軟件發展的新趨勢。因此,本文設計了一個基于XMPP協議的即時通訊系統,該系統可以讓用戶之間進行實時的聊天交流,使用起來十分簡單,實用性很強。
XMPP是一種網絡即時通信協議,它的前身是Jabber協議。它是一種基于XML的協議,它繼承了XML協議的靈活性和擴展性。因此,基于XMPP協議的應用也具有極強的可擴展性。經過擴展以后的XMPP可以通過發送擴展的信息來處理用戶的需求。XMPP還包含了針對服務器端的軟件協議,使之能與另一個進行通話,這使得開發者更容易建立客戶應用程序或給一個配好系統添加功能。盡管XMPP并沒有指定任何特定的網絡架構,但通常情況下,它是采用客戶端-服務器的架構進行實現,其中客戶端通過TCP方式使用XMPP訪問服務器,服務器之間也采用TCP方式進行通信。也就是說在大多數情況下,當兩個客戶端進行通訊時,它們之間的消息都是通過服務器傳遞的。采用這種架構的目的,主要是為了簡化客戶端,將大多數工作放在服務器端進行,這樣,客戶端的工作就會簡單很多。XMPP將復雜性從客戶端轉移到服務器端。這使得客戶端的程序編寫變得非常容易,更新系統功能也同樣變得容易。
XMPP中定義了3種角色:XMPP客戶端,XMPP服務器和網關。通信能夠在這三者的任意兩個之間雙向發生。服務器同時承擔了客戶端信息記錄、連接管理和信息的路由功能。網關承擔著與異構即時通信系統的互聯互通,異構系統可以包括SMS(短信)、MSN、ICQ等。以下是XMPP架構的抽象的示意圖(單向箭頭表示使用 XMPP通訊,雙向箭頭表示可使用任何協議通訊。)如圖1所示,其中Client1,Client2,Clinet3 是 XMPP 客戶端,Sever1,Sever2 是XMPP服務器,Gateway1是一個XMPP和外部(非XMPP)消息網絡之間進行 “翻譯”的網關,ForeignNet1是一個外部消息網絡,ForeignClient1是外部消息網絡上的一個客戶端。

圖1 XMPP的網絡架構
XMPP協議的通訊并非點對點的通訊,而是客戶端到服務器再到客戶端的方式,它們之間通信時傳輸的是XML文件,一個簡單的XMPP通訊流程可以歸納為:
1)客戶端連接到服務器以后,客戶端通過IO流發送一段XML文件,文件中包含了客戶端的用戶名和密碼;
2)服務器接收客戶端發來的XML文件,獲取其中的用戶名和密碼并對其進行驗證,若驗證通過,服務器會給客戶端發送一個XML文件告知登錄成功;
3)客戶端登錄成功后,會給服務器發送一個獲取好友名單的XML文件,服務器會以XML文件的形式發送給客戶端好友名單;
4)客戶端可以向任意一個好友發送消息,客戶端發送的信息先發送到服務器,服務器再轉發給好友,好友即可收到。
從目前已有的通訊系統來看,XMPP作為IM(Instent Messaging)即時通訊方面的成熟協議,已被FaceBook、Twitter、網易POPO等知名的通訊工具所應用,并且具有非常好的發展前景[2]。XMPP協議是自由的、源碼開放的。服務器端有類似OpenFire這樣的開源項目,客戶端有smack等基于Java的軟件開源協議包,開發人員可以直接使用這些開源工程,在必要時做一定的修改,這大大的減少了項目的開發難度。
文中研究的是在Android使用XMPP協議進行即時通信,所涉及3個主要的東西:OpenFire、Smack和spark,它們結合起來就是完整的XMPP即時通訊系統的實現[3]。這里簡單介紹一下它們作用:
OpenFire主要是作為服務器,管理客戶端的通信連接,并提供客戶端一些通信信息和連接信息。
Smack主要是對XMPP協議的實現,它提供了一套API,所有實現XMPP的操作都是通過使用Smack的API來實現,在Android里,使用的是Asmack這個包,這個包的作用與與Smack是相同的[4]。
Spark是客戶端的實現,它其實就是使用了Smack的API實現的。
它們三者之間的關系如圖2所示。

圖2 XMPP通訊系統的關系圖
在本即時通訊系統的設計中,采用Java語言來編寫項目程序。Java是一門面向對象、跨平臺的語言,其多線程與網絡編程機制是內置的,在編寫完成后可以運行在任何裝有Java虛擬機的平臺上,正是因為它的跨平臺性,用Java語言編寫的項目也有了更強的可擴展性[5]。
2.1 數據庫
即時通訊系統的數據庫至少要包括的數據表有,管理員表、用戶表、聊天記錄表、文件表等。數據庫的數據是根據實時的用戶信息而變化的,當用戶數據發生了增刪改查時,后臺也會對數據庫里的數據做出相應的更改,例如新增好友時,用戶的好友表也會新增一條數據。由于Java是通過JDBC以統一的接口訪問和操作各種數據庫系統的,而且支持的數據庫系統種類非常多,MySql、Oracle、SQL Server等主流數據庫應用都十分廣泛[6],功能也十分強大,優點也各不相同。本系統采用的是MySql數據庫,MySql的核心程序采用完全的多線程編程。線程是輕量級的進程,它可以靈活地為用戶提供服務,而不過多的占用系統資源。
2.2 服務端
在使用XMPP協議的即時通訊系統中,服務器充當的是XMPP通信的一個智能抽象層[7],它主要負責對受驗證的客戶端,服務器以及其他實體之間以XML流形式的連接和會話進行管理。并在這些實體之間使用XML流對合理編址的XML節進行路由管理。大部分XMPP兼容的服務器也負責存儲客戶端使用的數據[8](比如基于XMPP協議的及時消息中的聯系人名單),那么此時,XML數據直接由服務器來處理,而不需要轉發到其他的實體。
服務端應該包括的主要功能有:賬戶管理(注冊、登錄、注銷)、好友管理(新增好友、刪除好友)、消息管理等[9]。
下面是完成于Openfire服務器的連接和設置一些配置的代碼:


2.3 客戶端
大部分客戶端是通過TCP連接直接連接到服務器的[10],并且通過XMPP獲得由服務器以及聯合服務器所提供的全部功能。多個不同資源(比如不同的設備和地點)的客戶端可以同時登陸并且并發的連接到一個服務器[11],每個不同資源的客戶端通過XMPP地址的資源標識符來區分。XMPP客戶端與服務端通過XML在TCP套接字的5222端口進行通信,而不需要客戶端之間直接進行通信[12]。
客戶端的核心功能包括賬號管理:注冊、登陸、退出、用戶信息管理,好友管理:增加、刪除好友、更改昵稱、備注好友,聊天管理:聊天、聊天記錄存儲。做客戶端的賬號管理部分時,首先最重要的是登錄模塊,登錄的安全性決定了整個系統的價值。系統對登錄的賬號和密碼做出判斷,只有在本系統上注冊過得用戶才可以登錄該通訊系統,用戶或者密碼不匹配的用戶無法進行后續的操作,這保障了該通訊系統的安全性。并且普通用戶登錄后進入的界面和管理員的界面是不同的,他們都有各自能使用的功能和權限[13]。在好友管理模塊,用戶可以對自己的好友修改備注名,這樣即使用戶的好友們更改了自己的昵稱,或者不同的好友恰好使用了相同的昵稱時,用戶可以根據自己修改的備注名直接找到自己想聊天的好友,而系統也不需要把用戶昵稱作為用戶的唯一標識了。最后,在聊天管理模塊,用戶點擊一位好友頭像就可以和自己的任何一位好友發起一個聊天會話,他們的聊天記錄也保存在這個會話中,這樣一來,用戶和每一位好友的聊天記錄都保存在他們彼此的會話里,用戶與每位好友的聊天記錄都是單獨的,當其中一方刪除了聊天記錄以后,數據庫的記錄并不會刪除,所以另一方的聊天記錄也是存在的,這樣聊天管理起來也會變得十分簡單和方便。
如圖3所示是一個聊天的頁面。
本次系統測試從普通用戶和管理員兩個不同的方面對所有涉及到的功能模塊進行了測試,以保證順利走通每一個流程。首先從用戶這一方進行測試,測試用戶的注冊登錄功能,確保用戶的權限安全性,比如注冊時,后臺驗證該賬號是否已被注冊,登錄時后臺驗證賬號密碼是否匹配,若已經登錄則保存在一個session會話中[14],在規定時間內不需要重新登錄。其次就是驗證處理信息的準確性,例如實時的收發消息,根據賬號精確找到相應用戶來添加好友、刪除好友時解除好友關系以及會話權限。其次,從管理員這一方進行測試,測試管理員的權限,登錄時后臺要判斷是管理員還是普通用戶,管理普通用戶的信息,除了用戶可以更改自己的信息以外,管理員也有權限更改用戶的一些信息,例如禁止用戶發言或者禁用用戶的賬號。最后是對一些非常規操作的測試,用戶甲刪除了好友乙以后,乙的好友列表里也不再有張三這位好友,這樣做的優點是,當甲刪除乙以后,甲沒有和乙會話的權限,而乙的好友里沒有甲以后,乙也就無法向甲發起一個會話,避免了這種無效會話的產生。依據最后的測試結果表明,本系統滿足實時、方便、安全、穩定的特性,達到了設計的目的。

圖3 用戶的聊天記錄截圖
文中主要介紹了一個基于XMPP協議的即時通訊系統的設計和實現,并從幾個主要的模塊進行了講解。經過系統的測試證實,本系統可以用于即時通訊,并且穩定性較好,操作方便。同時由于Java語言面向對象的特性,當增加或修改功能時,都不需要對原系統進行大量的修改。而XMPP的典型的C/S架構,簡化了客戶端,將大多數工作放在服務器端進行,當增加功能時,多數是在服務器端進行[15]。從而使所開發的軟件結構合理,軟件重用性好、易于維護與擴充。
[1]李銳.淺談即時通訊工具現狀及其發展趨勢[J].中國科技信息, 2013(16):86.
[2]張逸炎,任品毅,李凡.移動終端即時消息推送系統的應用開發[C].第十七屆全國青年通信學術年會論文集,2012.
[3]李立亞,徐榮,潘曉燕.即時通信軟件用戶狀態管理策略與方法[J].電腦編程技巧與維護,2011(10):96-98.
[4]白鶴,歐陽峰,趙明,等.基于Jabber/XMPP擴展協議的文件共享發布系統 [J].廣播與電視技術.2012(5):15,44-47.
[5]張藝.基于WebSocket的即時通信系統研究與實現[J].軟件, 2015(3):89-94.
[6]張建平.基于Android校園即時信息系統研究[J].電子設計工程,2013(20):117-120.
[7]黃偉敏.基于XMPP協議的Android即時通信系統設計[J].電子設計工程,2011(8):57-59.
[8]錢海鋼.基于即時通信技術的圖書預約系統[J].科技情報開發與經濟,2013(16):18-21.
[9]林妍.局域網內即時通訊系統的設計 [J].中國新通信, 2013(12):8,13.
[10]李光明.應用SOCKET實現網絡通信[J].煤炭技術, 2012(3):88-90.
[11]謝智明.JAVA語言SOCKET機制的研究[J].湖南科技學院學報, 2011(4):70-72.
[12]諶頏.一種多功能網絡即時通訊系統的設計[J].網絡安全技術與應用, 2014(11):62,65.
[13]鐘桂鳳.基于Android平臺的食譜資訊管理系統的分析設計[J].技術與市場, 2014(12):34-35,38.
[14]張沖,劉涌,楊海波,等.移動社交網絡實時通信機制的研究[J].計算機系統應用,2014(2):205-208.
[15]李新路.XMPP協議在Android即時通訊系統中的應用[J].電腦知識與技術,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稿件編號:201608030
程化梅(1991—),女,湖北天門人,碩士研究生。研究方向:通信與信息系統、互聯網。