XMPP(Extensible Messaging and Presence Protocol,可擴展的消息和出席協(xié)議)是一種基于XML的傳遞消息路由和出席信息(Presence)的協(xié)議,它為不同的網(wǎng)絡(luò )之間互聯(lián)提供了一種安全而簡(jiǎn)單的編程語(yǔ)言,是Jabber系統(一種開(kāi)放源代碼的即時(shí)通信IM系統,Openfire系統的前稱(chēng))的基礎,其所具備的開(kāi)放特性,使開(kāi)發(fā)者之間互相合作,促進(jìn)了即時(shí)通信領(lǐng)域技術(shù)的進(jìn)步與交流.對
用戶(hù)而言,在面對現有的各種即時(shí)通信服務(wù),沒(méi)有統一標準,無(wú)法實(shí)現互聯(lián)互通的局面下,XMPP的出現,實(shí)現了整個(gè)即時(shí)通信服務(wù)協(xié)議的統一,促進(jìn)了服務(wù)器之間的準即時(shí)操作.即使其操作系統和瀏覽器不同的情況下,XMPP協(xié)議將最終允許因特網(wǎng)任何
用戶(hù)之間的消息傳送.近幾年來(lái),由于即時(shí)通信(IM)巨大的商業(yè)價(jià)值,僅國內就出現了QQ,網(wǎng)易泡泡,新浪UC等多種IM系統.本文將從實(shí)際項目開(kāi)發(fā)的角度出發(fā),探討XMPP協(xié)議及其服務(wù)器端實(shí)現的應用. 在IETF 中,把IM協(xié)議劃分為四種協(xié)議,即即時(shí)信息和出席協(xié)議(Instant Messaging and Presence Protocol, IMPP)、出席和即時(shí)信息協(xié)議(Presence and Instant Messaging Protocol, PRIM)、針對即時(shí)信息和出席擴展的會(huì )話(huà)發(fā)起協(xié)議(Sessi TYPE="audio/mpeg">
XMPP相對與其他幾種IM協(xié)議而言,有如下的優(yōu)點(diǎn):
1. XMPP 協(xié)議是公開(kāi)的,由JSF開(kāi)源社區組織開(kāi)發(fā)的。XMPP 協(xié)議并不屬于任何的機構和個(gè)人,而是屬于整個(gè)社區,這一點(diǎn)從根本上保證了其開(kāi)放性。
2. XMPP 協(xié)議具有良好的擴展性。在XMPP 中,即時(shí)消息和到場(chǎng)信息都是基于XML 的結構化信息,這些信息以XML 節(XML Stanza)的形式在通信實(shí)體間交換。XMPP 發(fā)揮了XML 結構化數據的通用傳輸層的作用,它將出席和上下文敏感信息嵌入到XML 結構化數據中,從而使數據以極高的效率傳送給最合適的資源?;赬ML 建立起來(lái)的應用具有良好的語(yǔ)義
完整性和擴展性。
3. 分布式的網(wǎng)絡(luò )架構。XMPP 協(xié)議都是基于Client/Server 架構,但是XMPP協(xié)議本身并沒(méi)有這樣的限制。網(wǎng)絡(luò )的架構和電子郵件十分相似,但沒(méi)有結合任何特定的網(wǎng)絡(luò )架構,適用范圍非常廣泛。
4. XMPP 具有很好的彈性。XMPP 除了可用在即時(shí)通信的應用程序,還能用在網(wǎng)絡(luò )管理、內容供稿、協(xié)同工具、檔案共享、游戲、遠端系統監控等。
5. 安全性。XMPP在Client-to-Server通信,和Server-to-Server通信中都使用TLS (Transport Layer Security)協(xié)議作為通信通道的加密方法,保證通信的安全。任何XMPP服務(wù)器可以獨立于公眾XMPP網(wǎng)絡(luò )(例如在企業(yè)內部網(wǎng)絡(luò )中),而使用SASL及TLS等技術(shù)更加增強了通信的安全性。如下圖所示: 本文的目標是通過(guò)研究XMPP協(xié)議,理解XMPP協(xié)議的系統架構及其通信原理。在此基礎上,重點(diǎn)研究XMPP協(xié)議的服務(wù)器端實(shí)現,在項目中采用了Openfire服務(wù)器端技術(shù)。
本文其余章節安排如下:
第二章對XMPP協(xié)議系統結構的描述,將XMPP協(xié)議網(wǎng)絡(luò )中的組成部分及其功能進(jìn)行了闡述。
第三章詳細闡述了XMPP協(xié)議的通訊格式,這是協(xié)議通信的底層基礎,所有的網(wǎng)絡(luò )通信均依靠Message,Presence以及IQ元素來(lái)傳遞。
第四章通過(guò)一個(gè)實(shí)例演示了XMPP協(xié)議的通信流程,本章內容建立在第三章基礎之上。 第五章是對XMPP服務(wù)器端的Openfire實(shí)現的一個(gè)簡(jiǎn)單介紹,描述了實(shí)際項目中針對Openfire所要做的二次開(kāi)發(fā)內容,是下一步的實(shí)際操作重點(diǎn)。 IETF 已經(jīng)將Jabber 定為即時(shí)通信和現場(chǎng)技術(shù)的標準協(xié)議,并改名為XMPP,相關(guān)的規范是RFC3920 和RFC3921,并且,JSF 也在它的XEP (XMPP Extensi TYPE="audio/mpeg">
圖2.1 XMPP網(wǎng)絡(luò )架構 2.2.1 XMPP客戶(hù)端 XMPP 系統的一個(gè)
設計標準是必須支持簡(jiǎn)單的客戶(hù)端。事實(shí)上,XMPP 系統架構對客戶(hù)端只有很少的幾個(gè)限制。一個(gè)XMPP 客戶(hù)端必須支持的功能有:
1. 通過(guò) TCP 套接字與XMPP 服務(wù)器進(jìn)行通信;
2. 解析組織好的 XML 信息包;
3. 理解消息數據類(lèi)型。
XMPP 將復雜性從客戶(hù)端轉移到服務(wù)器端。這使得客戶(hù)端編寫(xiě)變得非常容易,更新系統功能也同樣變得容易。XMPP 客戶(hù)端與服務(wù)端通過(guò)XML 在TCP 套接字的5222 端口進(jìn)行通信,而不需要客戶(hù)端之間直接進(jìn)行通信。
基本的XMPP 客戶(hù)端必須實(shí)現以下標準協(xié)議(XEP-0211):
RFC3920 核心協(xié)議Core
RFC3921 即時(shí)消息和出席協(xié)議Instant Messaging and Presence
XEP-0030 服務(wù)發(fā)現Service Discovery
XEP-0115 實(shí)體能力Entity Capabilities 2.2.2 XMPP服務(wù)器 XMPP 服務(wù)器遵循兩個(gè)主要法則:
l 監聽(tīng)客戶(hù)端連接,并直接與客戶(hù)端應用程序通信;
l 與其他 XMPP 服務(wù)器通信;
XMPP開(kāi)源服務(wù)器一般被
設計成模塊化,由各個(gè)不同的代碼包構成,這些代碼包分別處理Sessi xmlns ="jabber: client":xmlns: stream=
''http://etherx.jabber.org/streams''versi id="agsXMPP_1">
<query xmlns = "jabber:iq:auth"> <username> test </username> <password> <digest></query>
</iq>
(4)服務(wù)器端收到
用戶(hù)名等待
用戶(hù)提供密碼
<iq xmlns ="jabber:client"from ="localhost" type = "result"id ="agsXMPP_1">
<query xmlns ="jabber:iq:auth"><username>test </username> <password/> <digest/></query>
</iq>
(5)客戶(hù)端提供加密后的密碼
<iq xmlns="jabber:client" id="agsXMPP_2" to="localhost" type="set">
<query xmlns="jabber:iq:auth"><username>test</username><digest>
e66557d2b67256bf7e9b3l7 5lb6l0l674a56b5e </digest ><resource>MiniClient </resource></query>
</iq>
(6)服務(wù)器端從數據庫驗證
用戶(hù)名和密碼,并返回結果
<iq xmlns="jabber:client" from=" localhost" type="result" id="agsXMPP_2"/>
(7) 如果返同錯誤.客戶(hù)端提示并中斷連接,否則客戶(hù)端發(fā)送響應數據。
(8) 服務(wù)器端返回數據。
(9) 客戶(hù)端發(fā)送狀態(tài)。
(10) 服務(wù)器收到狀態(tài),發(fā)送IQ節并通知其他
用戶(hù)。 Openfire(原名Wildfire)是基于XMPP協(xié)議由Jive software公司開(kāi)發(fā)的一個(gè)開(kāi)源項目.它是實(shí)現XMPP協(xié)議的Server端包.Openfire與客戶(hù)端采用的是C/S架構.一個(gè)服務(wù)器要負責為連接在其上的客戶(hù)端提供服務(wù).Openfire是由Java語(yǔ)言編寫(xiě)的具有跨平臺能力的一款優(yōu)秀開(kāi)源軟件。
選擇Openfire作為業(yè)務(wù)服務(wù)器是因為其自身的諸多優(yōu)點(diǎn):
(1) Openfire內部集成Resin Web服務(wù)器,可以
設計基于Web的管理程序。
(2) 實(shí)現了插件機制,方便擴展。服務(wù)器在運行的時(shí)候,會(huì )定時(shí)地掃描一個(gè)特定目錄下的文件,當發(fā)現有新的Jar包出現時(shí),就讀入它所有的類(lèi),分析類(lèi)中有沒(méi)有支持插件接口的類(lèi),如果有,就加載并運行它。
(3)
用戶(hù)容量方面,單臺服務(wù)器可支持上萬(wàn)并發(fā)
用戶(hù)。在測試環(huán)境下可以支持5000
用戶(hù)同時(shí)在線(xiàn),每秒可以轉發(fā)2000個(gè)包。
(4) Openfire安裝和使用都非常簡(jiǎn)單。 Openfire 是XMPP的服務(wù)器端實(shí)現,在基于Openfire的IM系統中,客戶(hù)端和服務(wù)器之間的通信是依靠底層Smack庫提供的各種功能來(lái)完成的。而利用插件方式來(lái)擴展Openfire 服務(wù)器端主要有兩種擴展方式,一種是對服務(wù)器控制臺頁(yè)面進(jìn)行擴展(不是開(kāi)發(fā)的主要目標),其實(shí)就是遵循Openfire 頁(yè)面的布局方式,進(jìn)行相應的頁(yè)面擴展和功能擴展;另一種是對通信功能進(jìn)行擴展。本文主要針對后者進(jìn)行具體的描述. Openfire插件開(kāi)發(fā)的大致如下:
1、創(chuàng )建/修改openfire的plugin.xml(這是整個(gè)插件最關(guān)鍵的配置文件);
2、創(chuàng )建服務(wù)器插件實(shí)例(實(shí)現Plugin 接口的類(lèi)和一批IQHandler);
3、打包插件(Openfire 插件有自己的打包方式)和部署插件
;
詳細的插件開(kāi)發(fā)指南不是本文的內容,可以參考Openfire項目的插件開(kāi)發(fā)指南,詳見(jiàn)參考文獻http://www.igniterealtime.org/builds/openfire/docs /latest/documentati TYPE="audio/mpeg">