關(guān)于xmpp網(wǎng)上資料太多了宜鸯,可是沒有找到一篇比較全面文章蜡镶,都是得自己東平西湊的學(xué)習(xí),這樣學(xué)比較費(fèi)勁,于是自己整理多方資料并總結(jié)一下自己的學(xué)習(xí)點(diǎn)滴和使用xmpp開發(fā)的一些方法厂抖,算是方便他人和自己學(xué)習(xí)和鞏固吧。
一赋焕、xmpp是什么榜揖?
XMPP is the Extensible Messaging and Presence Protocol, a set of open technologies for instant messaging, presence, multi-party chat, voice and video calls, collaboration, lightweight middleware, content syndication, and generalized routing of XML data。
上面是摘自xmpp官方的解釋鸽素,底下是根據(jù)自己理解的翻譯褒繁,可能有些牽強(qiáng),不足的地方請(qǐng)大牛指點(diǎn)馍忽。
XMPP 是一個(gè)擴(kuò)展的消息和表示協(xié)議棒坏,是一系列的開源技術(shù)用于即時(shí)通訊、表示呈現(xiàn)遭笋、多方聊天坝冕、音頻和視頻通話、協(xié)作瓦呼、輕量級(jí)中間組件喂窟、內(nèi)容聚合和xml數(shù)據(jù)通用路由。
也可以這樣理解用途:可用于服務(wù)類實(shí)時(shí)通訊、表示和需求響應(yīng)服務(wù)中的XML數(shù)據(jù)元流式傳輸磨澡。
XMPP的前世今生
XMPP的前身是Jabber碗啄,一個(gè)開源形式組織產(chǎn)生的網(wǎng)絡(luò)即時(shí)通信協(xié)議。XMPP目前被IETF國(guó)際標(biāo)準(zhǔn)組織完成了標(biāo)準(zhǔn)化工作钱贯。標(biāo)準(zhǔn)化的核心結(jié)果分為兩部分:核心的XML流傳輸協(xié)議挫掏;基于XMLFreeEIM流傳輸?shù)募磿r(shí)通訊擴(kuò)展應(yīng)用。
Jabber 是著名的Linux即時(shí)通訊服務(wù)服務(wù)器秩命,它是一個(gè)自由開源軟件尉共,能讓用戶自己架即時(shí)通訊服務(wù)器,可以在Internet上應(yīng)用弃锐,也可以在局域網(wǎng)中應(yīng)用袄友。
二、xmpp的優(yōu)勢(shì)
下面是對(duì)官方An Overview of XMPP關(guān)鍵點(diǎn)簡(jiǎn)單翻譯總結(jié)霹菊,感覺對(duì)全面了解xmpp很有用就寫在這里剧蚣。
XMPP有何牛逼之處
1.開源:協(xié)議開源,且在客戶端旋廷、服務(wù)鸠按、服務(wù)組件和一些庫(kù)都有相應(yīng)的實(shí)現(xiàn)。
2.標(biāo)準(zhǔn)化:IETF組織已經(jīng)標(biāo)準(zhǔn)化核心的xml流協(xié)議(RFC 6120, RFC 6121, and RFC 7622).
3.可靠的:目前以后上萬(wàn)臺(tái)xmpp服務(wù)器在運(yùn)行饶碘,百萬(wàn)的的用戶正在使用以xmpp作為即時(shí)通訊目尖。
4.去中心化:任何人都可以運(yùn)行自己xmpp服務(wù)器,并且之間可以向發(fā)郵件一樣互聯(lián)扎运。
5.安全:SASL 和 TLS安全協(xié)議已經(jīng)被規(guī)范到xmpp協(xié)議當(dāng)中了瑟曲。
6.可擴(kuò)展性:強(qiáng)大的xml傳輸可以幫助我們?cè)诤诵膮f(xié)議上任意擴(kuò)展。
7.靈活性:xmpp不僅僅是聊天工具豪治,還包括網(wǎng)絡(luò)管理洞拨、協(xié)作工具、文件共享负拟、遠(yuǎn)程監(jiān)控烦衣、web服務(wù)和云計(jì)算等。
8.多樣性:很多公司和開源項(xiàng)目都在使用XMPP技術(shù)掩浙,所以在使用XMPP時(shí)你是不會(huì)陷入困境的琉挖。
XMPP的關(guān)鍵技術(shù)
1.核心:xml流的xmpp技術(shù)。
2.jingle:通過(guò) Jingle 可以實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)(P2P)的多媒體交互會(huì)話控制
3.多人聊天:靈活的多人聊天涣脚。
4.訂閱通知:通知和訂閱
5.BOSH:一個(gè)擁有xmpp傳輸?shù)膆ttp綁定示辈。
三、基于XMPP的即時(shí)通訊架構(gòu)
XMPP工作原理
XMPP中定義了三個(gè)角色遣蚀,客戶端矾麻,服務(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搞乏。
XMPP和其他系統(tǒng)互聯(lián)通信架構(gòu)
XMPP具體通信過(guò)程
四波桩、核心xml流協(xié)議
XMPP 的核心數(shù)據(jù)包類型有Precense,Message请敦,Iq 镐躲,此外加上初始化 stream 用到的 Stream 數(shù)據(jù)包。這些數(shù)據(jù)包是 XMPP 信息傳輸?shù)妮d體侍筛,被用于 XMPP 核心功能和擴(kuò)展功能的實(shí)現(xiàn)萤皂。
公有屬性
在 XML stream 中,每個(gè)數(shù)據(jù)包都是 XML 格式純文本匣椰。而每個(gè) XML 數(shù)據(jù)包有以下公有屬性:
to: 數(shù)據(jù)包要發(fā)送的目的地址
from:數(shù)據(jù)包發(fā)送的源地址
id:數(shù)據(jù)包標(biāo)示符
此三項(xiàng)屬性在 XML stanza 中最為常見裆熙。
to 和 from 屬性用于服務(wù)器決定該數(shù)據(jù)包的路由規(guī)則。某些情況下窝爪,to 和 from 屬性可以只有一個(gè),例如:客戶端向服務(wù)端發(fā)送設(shè)置配置的 Iq 包只含有 to (不向外路由)齐媒,客戶端向聯(lián)系人發(fā)送 Message 只含有 to (from 屬性總是被改寫為客戶端的地址)蒲每。
id 用于節(jié)點(diǎn)間判斷請(qǐng)求和應(yīng)答數(shù)據(jù)包的對(duì)應(yīng)狀況,大多數(shù)情況可以不處理喻括。
初始化 XML stream邀杏,身份驗(yàn)證
在客戶端與服務(wù)器產(chǎn)生 TCP 連接后,需要與服務(wù)器初始化 XML stream唬血,以及進(jìn)行身份驗(yàn)證望蜡。
初始化時(shí),客戶端發(fā)送 stream 頭部 XML:
服務(wù)器在收到客戶端的 stream 頭后拷恨,回應(yīng)一個(gè) stream 頭:
接著服務(wù)器向客戶端發(fā)送服務(wù)端支持的身份驗(yàn)證方式列表脖律,常見的方式有基于安全傳輸 SASL 的 BASE64 編碼賬戶密碼驗(yàn)證。身份驗(yàn)證的種類多樣腕侄。
打開stream流對(duì)話后客戶端和服務(wù)端就可以開始會(huì)話了小泉,比如我想問(wèn)服務(wù)端獲取我的好友列表芦疏,我就可以向服務(wù)器發(fā)送下文中的get類型Iq數(shù)據(jù)包。
客戶端:
該請(qǐng)求的意義為:名為 sawyer 的用戶 (登錄資源為 iOS) 向 example.com 服務(wù)器請(qǐng)求獲得 (get) roster 表微姊。
服務(wù)器收到請(qǐng)求后酸茴,返回 roster 表。
服務(wù)端:
可以看到兢交,sawyer 的 roster 表內(nèi)有3個(gè)聯(lián)系人薪捍,分別名為 Romeo,Mercutio配喳,Benvolio酪穿,都屬于 Friends 分組。Roster 列表中的 JID 信息將會(huì)用在稍候客戶端發(fā)送信息包的目的地址中界逛。
Item 中的 subscription 關(guān)系到聯(lián)系人狀態(tài)信息的傳輸昆稿,有 none,both息拜,from溉潭,to 四種。詳細(xì)的 subscription 操作在 RFC 3921Managing Subscriptions 章節(jié)[7]中定義少欺。
獲取完好友列表喳瓣,我就可以給我的Romeo好友發(fā)個(gè)問(wèn)候了,Message 是即時(shí)聊天應(yīng)用中最常用的數(shù)據(jù)包赞别,其功能是發(fā)送用戶聊天信息畏陕。一個(gè) Message 例子如下:
客戶端:
該 message 包將會(huì)被服務(wù)器轉(zhuǎn)發(fā)至 example.net 服務(wù)器,隨后轉(zhuǎn)交給 romeo 已登錄的客戶端上(如果該用戶沒有登錄仿滔,message 信息會(huì)儲(chǔ)存在服務(wù)端直至用戶上線)惠毁。
其中,body 標(biāo)簽中包含用戶要傳輸?shù)牧奶煨畔ⅰ?/p>
要傳輸格式化的富文本信息崎页,可以通過(guò)支持?jǐn)U展 XEP-0071[8]鞠绰,引入 html 標(biāo)簽。
用戶不想聊天了飒焦,想關(guān)閉會(huì)話蜈膨。
在對(duì)話結(jié)束時(shí),客戶端和服務(wù)端要先后發(fā)送 stream 尾部 XML牺荠,以使整個(gè) XMP stream 閉合翁巍。(如果 TCP 異常中斷,則服務(wù)端直接中斷對(duì)話)
客戶端:
</stream:stream>
服務(wù)端:
</stream:stream>
五休雌、常用的服務(wù)端和前端框架
iOS常用框架及開源作品
1.iOS端常用框架:https://github.com/robbiehanson/XMPPFramework
2.個(gè)人感覺不錯(cuò)的Demo:
https://github.com/149393437/ZCXMPPManager
https://github.com/vviicc/QShare_iOS
https://github.com/adow/Dollarss
android常用的框架及開源作品
1.android常用框架:https://github.com/Flowdalic/asmack
2.不錯(cuò)的安卓開源作品:https://github.com/jiangzehui/xmpp
服務(wù)端比較常用的聊天服務(wù)器。
1.java語(yǔ)言實(shí)現(xiàn)的服務(wù)器Openfire
openfire采用嵌入式Jetty服務(wù)器(相對(duì)tomcat而言)集成到工程里杈曲,安裝完程序孝情,開啟服務(wù)即可使用。
源碼github地址:https://github.com/igniterealtime/Openfire
源碼分析地址:http://www.360doc.com/content/13/0601/17/1542811_289727966.shtml
官網(wǎng)地址:http://www.igniterealtime.org/projects/openfire/
2.Erlang語(yǔ)言實(shí)現(xiàn)的服務(wù)器Ejabberd
源碼github地址:https://github.com/processone/ejabberd
官網(wǎng)地址:https://www.ejabberd.im?
六箫荡、參考文檔
1.XMPP官方文檔 :https://xmpp.org
2.XMPP官方概要:https://xmpp.org/about/technology-overview.html
3.XMPP核心協(xié)議:https://xmpp.org/rfcs/rfc6120.html
4.程序員的世界博客:http://www.voidcn.com/blog/bolg_hero/article/p-2715024.html
5.架構(gòu)圖來(lái)源均為網(wǎng)上。