前面關(guān)于即時(shí)通訊基礎(chǔ)Socket,大家學(xué)習(xí)使用XMPP之前可以先看看
即時(shí)通訊系列之Socket簡(jiǎn)介
前言
前段時(shí)間使用XMPPFramework完成了一個(gè)仿微信的小項(xiàng)目,故特此來(lái)記錄下即時(shí)通訊開(kāi)發(fā)過(guò)程中的知識(shí)點(diǎn)以及存在一些問(wèn)題,歡迎大家前來(lái)指教.
關(guān)于仿微信的demo在后面的篇章中會(huì)有g(shù)ithub地址,請(qǐng)關(guān)注.本篇是關(guān)于XMPP的相關(guān)介紹
1.為什么選擇XMPP協(xié)議
在IETF 中,把IM協(xié)議劃分為四種協(xié)議,即即時(shí)信息和出席協(xié)議(Instant Messaging and Presence Protocol, IMPP)访惜、出席和即時(shí)信息協(xié)議(Presence and Instant Messaging Protocol, PRIM)陈辱、針對(duì)即時(shí)信息和出席擴(kuò)展的會(huì)話發(fā)起協(xié)議(Session Initiation Protocol for Instant Messaging and Presence Leveraging Extensions, SIMPLE)褂微,以及可擴(kuò)展的消息出席協(xié)議(XMPP)
XMPP協(xié)議的前身是Jabber箫章,我們采取XMPP協(xié)議主來(lái)實(shí)現(xiàn)IM主要是考慮XMPP協(xié)議是以XML為基礎(chǔ)的诊笤,它繼承了在XML環(huán)境中靈活的發(fā)展性美侦。這表明XMPP是可擴(kuò)展的产舞,所以XMPP信息不僅可以是簡(jiǎn)單的文本,而且可以攜帶復(fù)雜的數(shù)據(jù)和各種格式的文件
1.XMPP 協(xié)議是公開(kāi)的菠剩,由JSF開(kāi)源社區(qū)組織開(kāi)發(fā)的易猫。XMPP 協(xié)議并不屬于任何的機(jī)構(gòu)和個(gè)人,而是屬于整個(gè)社區(qū)具壮,這一點(diǎn)從根本上保證了其開(kāi)放性准颓。
2.XMPP 協(xié)議具有良好的擴(kuò)展性。在XMPP 中棺妓,即時(shí)消息和到場(chǎng)信息都是基于XML 的結(jié)構(gòu)化信息攘已,這些信息以XML 節(jié)(XML Stanza)的形式在通信實(shí)體間交換。XMPP 發(fā)揮了XML 結(jié)構(gòu)化數(shù)據(jù)的通用傳輸層的作用怜跑,它將出席和上下文敏感信息嵌入到XML 結(jié)構(gòu)化數(shù)據(jù)中样勃,從而使數(shù)據(jù)以極高的效率傳送給最合適的資源⌒苑遥基于XML 建立起來(lái)的應(yīng)用具有良好的語(yǔ)義完整性和擴(kuò)展性峡眶。
3.分布式的網(wǎng)絡(luò)架構(gòu)。XMPP 協(xié)議都是基于Client/Server 架構(gòu)植锉,但是XMPP協(xié)議本身并沒(méi)有這樣的限制辫樱。網(wǎng)絡(luò)的架構(gòu)和電子郵件十分相似,但沒(méi)有結(jié)合任何特定的網(wǎng)絡(luò)架構(gòu)汽煮,適用范圍非常廣泛搏熄。
4.XMPP 具有很好的彈性棚唆。XMPP 除了可用在即時(shí)通信的應(yīng)用程序,還能用在網(wǎng)絡(luò)管理心例、內(nèi)容供稿宵凌、協(xié)同工具、檔案共享止后、游戲瞎惫、遠(yuǎn)端系統(tǒng)監(jiān)控等。
5.安全性译株。XMPP在Client-to-Server通信瓜喇,和Server-to-Server通信中都使用TLS (Transport Layer Security)協(xié)議作為通信通道的加密方法,保證通信的安全歉糜。任何XMPP服務(wù)器可以獨(dú)立于公眾XMPP網(wǎng)絡(luò)(例如在企業(yè)內(nèi)部網(wǎng)絡(luò)中)乘寒,而使用SASL及TLS等技術(shù)更加增強(qiáng)了通信的安全性。如下圖所示:
2.XMPP的基本網(wǎng)絡(luò)結(jié)構(gòu)
XMPP是一個(gè)典型的C/S架構(gòu)匪补,而不是像大多數(shù)即時(shí)通訊軟件一樣伞辛,使用P2P客戶端到客戶端的架構(gòu),也就是說(shuō)在大多數(shù)情況下夯缺,當(dāng)兩個(gè)客戶端進(jìn)行通訊時(shí)蚤氏,他們的消息都是通過(guò)服務(wù)器傳遞的(也有例外,例如在兩個(gè)客戶端傳輸文件時(shí)).采用這種架構(gòu)踊兜,主要是為了簡(jiǎn)化客戶端竿滨,將大多數(shù)工作放在服務(wù)器端進(jìn)行,這樣捏境,客戶端的工作就比較簡(jiǎn)單于游,而且,當(dāng)增加功能時(shí)典蝌,多數(shù)是在服務(wù)器端進(jìn)行.XMPP服務(wù)的框架結(jié)構(gòu)如下圖所示.XMPP中定義了三個(gè)角色曙砂,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等.基本的網(wǎng)絡(luò)形式是單客戶端通過(guò)TCP/IP連接到單服務(wù)器,然后在之上傳輸XML葵袭,工作原理是:
(1)節(jié)點(diǎn)連接到服務(wù)器涵妥;
(2)服務(wù)器利用本地目錄系統(tǒng)中的證書對(duì)其認(rèn)證;
(3)節(jié)點(diǎn)指定目標(biāo)地址坡锡,讓服務(wù)器告知目標(biāo)狀態(tài)蓬网;
(4)服務(wù)器查找窒所、連接并進(jìn)行相互認(rèn)證;
(5)節(jié)點(diǎn)之間進(jìn)行交互.
3.XMPP客戶端
XMPP 系統(tǒng)的一個(gè)設(shè)計(jì)標(biāo)準(zhǔn)是必須支持簡(jiǎn)單的客戶端帆锋。事實(shí)上吵取,XMPP 系統(tǒng)架構(gòu)對(duì)客戶端只有很少的幾個(gè)限制。一個(gè)XMPP 客戶端必須支持的功能有:
通過(guò) TCP 套接字與XMPP 服務(wù)器進(jìn)行通信锯厢;
解析組織好的 XML 信息包皮官;
理解消息數(shù)據(jù)類型。
XMPP 將復(fù)雜性從客戶端轉(zhuǎn)移到服務(wù)器端实辑。這使得客戶端編寫變得非常容易捺氢,更新系統(tǒng)功能也同樣變得容易。XMPP 客戶端與服務(wù)端通過(guò)XML 在TCP 套接字的5222 端口進(jìn)行通信剪撬,而不需要客戶端之間直接進(jìn)行通信摄乒。
基本的XMPP 客戶端必須實(shí)現(xiàn)以下標(biāo)準(zhǔn)協(xié)議(XEP-0211):
RFC3920 核心協(xié)議Core
RFC3921 即時(shí)消息和出席協(xié)議Instant Messaging and Presence
XEP-0030 服務(wù)發(fā)現(xiàn)Service Discovery
XEP-0115 實(shí)體能力Entity Capabilities
4.XMPP服務(wù)器
XMPP 服務(wù)器遵循兩個(gè)主要法則:
l 監(jiān)聽(tīng)客戶端連接,并直接與客戶端應(yīng)用程序通信婿奔;
l 與其他 XMPP 服務(wù)器通信缺狠;
XMPP開(kāi)源服務(wù)器一般被設(shè)計(jì)成模塊化,由各個(gè)不同的代碼包構(gòu)成萍摊,這些代碼包分別處理Session管理、用戶和服務(wù)器之間的通信如叼、服務(wù)器之間的通信冰木、DNS(Domain Name System)轉(zhuǎn)換、存儲(chǔ)用戶的個(gè)人信息和朋友名單笼恰、保留用戶在下線時(shí)收到的信息踊沸、用戶注冊(cè)、用戶的身份和權(quán)限認(rèn)證社证、根據(jù)用戶的要求過(guò)濾信息和系統(tǒng)記錄等逼龟。另外,服務(wù)器可以通過(guò)附加服務(wù)來(lái)進(jìn)行擴(kuò)展追葡,如完整的安全策略腺律,允許服務(wù)器組件的連接或客戶端選擇臭觉,通向其他消息系統(tǒng)的網(wǎng)關(guān)千劈。
基本的XMPP 服務(wù)器必須實(shí)現(xiàn)以下標(biāo)準(zhǔn)協(xié)議
RFC3920 核心協(xié)議Core
RFC3921 即時(shí)消息和出席協(xié)議Instant Messaging and Presence
XEP-0030 服務(wù)發(fā)現(xiàn)Service Discovery
5.XMPP網(wǎng)關(guān)
XMPP 突出的特點(diǎn)是可以和其他即時(shí)通信系統(tǒng)交換信息和用戶在線狀況婉弹。由于協(xié)議不同归斤,XMPP 和其他系統(tǒng)交換信息必須通過(guò)協(xié)議的轉(zhuǎn)換來(lái)實(shí)現(xiàn)辅愿,目前幾種主流即時(shí)通信協(xié)議都沒(méi)有公開(kāi)姐叁,所以XMPP 服務(wù)器本身并沒(méi)有實(shí)現(xiàn)和其他協(xié)議的轉(zhuǎn)換潘悼,但它的架構(gòu)允許轉(zhuǎn)換的實(shí)現(xiàn)庞萍。實(shí)現(xiàn)這個(gè)特殊功能的服務(wù)端在XMPP 架構(gòu)里叫做網(wǎng)關(guān)(gateway)遣铝。目前佑刷,XMPP 實(shí)現(xiàn)了和AIM莉擒、ICQ、IRC瘫絮、MSN Massager啰劲、RSS0.9 和Yahoo Massager 的協(xié)議轉(zhuǎn)換。由于網(wǎng)關(guān)的存在檀何,XMPP 架構(gòu)事實(shí)上兼容所有其他即時(shí)通信網(wǎng)絡(luò)蝇裤,這無(wú)疑大大提高了XMPP 的靈活性和可擴(kuò)展性。
6.服務(wù)器端介紹
6.1 什么是Openfire
Openfire 采用Java開(kāi)發(fā)频鉴,開(kāi)源的實(shí)時(shí)協(xié)作(RTC)服務(wù)器基于XMPP(Jabber)協(xié)議栓辜。您可以使用它輕易的構(gòu)建高效率的即時(shí)通信服務(wù)器.
Openfire安裝和使用都非常簡(jiǎn)單,并利用Web進(jìn)行管理垛孔。單臺(tái)服務(wù)器可支持上萬(wàn)并發(fā)用戶藕甩。
由于是采用開(kāi)放的XMPP協(xié)議,您可以使用各種支持XMPP協(xié)議的IM客戶端軟件登陸服務(wù).
6.2為什么使用Openfire
A周荐、Openfire為Java開(kāi)源項(xiàng)目
B狭莱、 采用開(kāi)放的XMPP協(xié)議
C、 有多種針對(duì)不通系統(tǒng)的版本
D概作、使用Socket通訊
E腋妙、 單臺(tái)服務(wù)器可支持上萬(wàn)并發(fā)用戶,搭建分布式云服務(wù)器可輕松提供大量并發(fā)用戶。
F讯榕、 Socket長(zhǎng)連接
G骤素、服務(wù)器穩(wěn)定
H、提供接口愚屁,可自己開(kāi)發(fā)插件
7.XMPP協(xié)議的組成
RFC 3920 XMPP:核心济竹。定義了XMPP 協(xié)議框架下應(yīng)用的網(wǎng)絡(luò)架構(gòu),引入了XML Stream(XML 流)與XML Stanza(XML 節(jié))霎槐,并規(guī)定XMPP 協(xié)議在通信過(guò)程中使用的XML 標(biāo)簽送浊。使用XML 標(biāo)簽從根本上說(shuō)是協(xié)議開(kāi)放性與擴(kuò)展性的需要。此外丘跌,在通信的安全方面袭景,把TLS 安全傳輸機(jī)制與SASL 認(rèn)證機(jī)制引入到內(nèi)核,與XMPP 進(jìn)行無(wú)縫的連接碍岔,為協(xié)議的安全性浴讯、可靠性奠定了基礎(chǔ)。Core 文檔還規(guī)定了錯(cuò)誤的定義及處理蔼啦、XML 的使用規(guī)范榆纽、JID(Jabber Identifier,Jabber 標(biāo)識(shí)符)的定義、命名規(guī)范等等奈籽。所以這是所有基于XMPP 協(xié)議的應(yīng)用都必需支持的文檔饥侵。
RFC 3921:用戶成功登陸到服務(wù)器之后,發(fā)布更新自己的在線好友管理衣屏、發(fā)送即時(shí)聊天消息等業(yè)務(wù)躏升。所有的這些業(yè)務(wù)都是通過(guò)三種基本的XML 節(jié)來(lái)完成的:IQ Stanza(IQ 節(jié)), Presence Stanza(Presence 節(jié)), Message Stanza(Message 節(jié))。RFC3921 還對(duì)阻塞策略進(jìn)行了定義狼忱,定義是多種阻塞方式膨疏。可以說(shuō)钻弄,RFC3921 是RFC3920 的充分補(bǔ)充佃却。兩個(gè)文檔結(jié)合起來(lái),就形成了一個(gè)基本的即時(shí)通信協(xié)議平臺(tái)窘俺,在這個(gè)平臺(tái)上可以開(kāi)發(fā)出各種各樣的應(yīng)用饲帅。
XEP-0030 服務(wù)搜索。一個(gè)強(qiáng)大的用來(lái)測(cè)定XMPP 網(wǎng)絡(luò)中的其它實(shí)體所支持特性的協(xié)議瘤泪。
XEP-0115 實(shí)體性能灶泵。XEP-0030 的一個(gè)通過(guò)即時(shí)出席的定制,可以實(shí)時(shí)改變交變廣告功能对途。
XEP-0045 多人聊天赦邻。一組定義參與和管理多用戶聊天室的協(xié)議,類似于Internet 的Relay Chat掀宋,具有很高的安全性深纲。
XEP-0096 文件傳輸。定義了從一個(gè)XMPP 實(shí)體到另一個(gè)的文件傳輸劲妙。
XEP-0124 HTTP 綁定。將XMPP 綁定到HTTP 而不是TCP儒喊,主要用于不能夠持久的維持與服務(wù)器TCP 連接的設(shè)備镣奋。
XEP-0166 Jingle。規(guī)定了多媒體通信協(xié)商的整體架構(gòu)怀愧。
XEP-0167 Jingle Audio Content Description Format侨颈。定義了從一個(gè)XMPP 實(shí)體到另一個(gè)的語(yǔ)音傳輸過(guò)程。
XEP-0176 Jingle ICE(Interactive Connectivity Establishment)Transport芯义。ICE傳輸機(jī)制哈垢,文件解決了如何讓防火墻或是NAT(Network Address Translation)保護(hù)下的實(shí)體建立連接的問(wèn)題。
XEP-0177 Jingle Raw UDP Transport扛拨。純UDP 傳輸機(jī)制耘分,文件講述了如何在沒(méi)有防火墻且在同一網(wǎng)絡(luò)下建立連接的。
XEP-0180 Jingle Video Content Description Format。定義了從一個(gè)XMPP 實(shí)體到另一個(gè)的視頻傳輸過(guò)程求泰。
XEP-0181 Jingle DTMF(Dual Tone Multi-Frequency)央渣。
XEP-0183 Jingle Telepathy Transport Method。
8.XMPP地址格式
一個(gè)實(shí)體在XMPP網(wǎng)絡(luò)結(jié)構(gòu)中被稱為一個(gè)接點(diǎn)渴频,它有唯一的標(biāo)示符jabber identifier(JID)芽丹,即實(shí)體地址,用來(lái)表示一個(gè)Jabber用戶卜朗,但是也可以表示其他內(nèi)容拔第,例如一個(gè)聊天室.一個(gè)有效的JID包括一系列元素:(1)域名(domain identifier);(2)節(jié)點(diǎn)(node identifier)场钉;(3)源(resource identifier).它的格式是node@domain/resource蚊俺,node@domain ,類似電子郵件的地址格式.domain用來(lái)表示接點(diǎn)不同的設(shè)備或位置惹悄,這個(gè)是可選的春叫,例如a在Server1上注冊(cè)了一個(gè)用戶,用戶名為doom泣港,那么a的JID就是doom@serverl暂殖,在發(fā)送消息時(shí),指明doom@serverl就可以了当纱,resource可以不用指定呛每,但a在登錄到這個(gè)Server時(shí),fl的JID可能是doom@serverl坡氯、exodus(如果a用Exodus軟件登錄)晨横,也可能是doom@serverl/psi(如果a用psi軟件登錄).資源只用來(lái)識(shí)別屬于用戶的位置或設(shè)備等,一個(gè)用戶可以同時(shí)以多種資源與同一個(gè)XMPP服務(wù)器連接箫柳。
XMPP消息格式
XMPP通信原語(yǔ)有3種:message手形、presence和iq。
message
message是一種基本推送消息方法悯恍,它不要求響應(yīng)库糠。主要用于IM、groupChat涮毫、alert和notification之類的應(yīng)用中瞬欧。
主要屬性如下:
type屬性,它主要有5種類型:
normal:類似于email罢防,主要特點(diǎn)是不要求響應(yīng)艘虎;
chat:類似于qq里的好友即時(shí)聊天,主要特點(diǎn)是實(shí)時(shí)通訊咒吐;
groupchat:類似于聊天室里的群聊野建;
headline:用于發(fā)送alert和notification属划;
error:如果發(fā)送message出錯(cuò),發(fā)現(xiàn)錯(cuò)誤的實(shí)體會(huì)用這個(gè)類別來(lái)通知發(fā)送者出錯(cuò)了贬墩;
to屬性:標(biāo)識(shí)消息的接收方榴嗅。
from屬性:指發(fā)送方的名字或標(biāo)示。為防止地址外泄陶舞,這個(gè)地址通常由發(fā)送者的server填寫嗽测,而不是發(fā)送者。
載荷(payload):例如body肿孵,subject,thread
例子:
<message
to="lily@jabber.org/contact"
type="chat" >
<body> 你好唠粥,在忙嗎</body>
</message>
presence
presence用來(lái)表明用戶的狀態(tài),如:online停做、away晤愧、dnd(請(qǐng)勿打擾)等。當(dāng)改變自己的狀態(tài)時(shí)蛉腌,就會(huì)在stream的上下文中插入一個(gè)Presence元素官份,來(lái)表明自身的狀態(tài)。要想接受presence消息烙丛,必須經(jīng)過(guò)一個(gè)叫做presence subscription的授權(quán)過(guò)程舅巷。
屬性:
type屬性,非必須河咽。有以下類別
subscribe:訂閱其他用戶的狀態(tài)
probe:請(qǐng)求獲取其他用戶的狀態(tài)
unavailable:不可用钠右,離線(offline)狀態(tài)
to屬性:標(biāo)識(shí)消息的接收方。
from屬性:指發(fā)送方的名字或標(biāo)示忘蟹。
載荷(payload):
show:
chat:聊天中
away:暫時(shí)離開(kāi)
xa:eXtend Away飒房,長(zhǎng)時(shí)間離開(kāi)
dnd:勿打擾
status:格式自由,可閱讀的文本媚值。也叫做rich presence或者extended presence狠毯,常用來(lái)表示用戶當(dāng)前心情,活動(dòng)褥芒,聽(tīng)的歌曲垃你,看的視頻,所在的聊天室喂很,訪問(wèn)的網(wǎng)頁(yè),玩的游戲等等皆刺。
priority:范圍-128~127少辣。高優(yōu)先級(jí)的resource能接受發(fā)送到bare JID的消息,低優(yōu)先級(jí)的resource不能羡蛾。優(yōu)先級(jí)為負(fù)數(shù)的resource不能收到發(fā)送到bare JID的消息漓帅。
例子:
<presence from="alice@wonderland.lit/pda">
<show>xa</show>
<status>down the rabbit hole!</status>
</presence>
iq (Info / Query)
一種請(qǐng)求/響應(yīng)機(jī)制,從一個(gè)實(shí)體從發(fā)送請(qǐng)求,另外一個(gè)實(shí)體接受請(qǐng)求忙干,并進(jìn)行響應(yīng)器予。例如,client在stream的上下文中插入一個(gè)元素捐迫,向Server請(qǐng)求得到自己的好友列表乾翔,Server返回一個(gè),里面是請(qǐng)求的結(jié)果施戴。
主要的屬性是type反浓。包括:
Get :獲取當(dāng)前域值。類似于http get方法赞哗。
Set :設(shè)置或替換get查詢的值雷则。類似于http put方法。
Result :說(shuō)明成功的響應(yīng)了先前的查詢肪笋。類似于http狀態(tài)碼200月劈。
Error: 查詢和響應(yīng)中出現(xiàn)的錯(cuò)誤。
例子:
<iq from="alice@wonderland.lit/pda"
id="rr82a1z7"
to="alice@wonderland.lit"
type="get">
<query xmlns="jabber:iq:roster"/>
</iq>
XMPP 3920 最靠譜的中文翻譯文檔
http://wenku.baidu.com/view/563b1ebff121dd36a32d8225.html
XMPP-RFC3921中文