關(guān)于xmpp網(wǎng)上資料太多了,可是沒有找到一篇比較全面文章,都是得自己東平西湊的學習,這樣學比較費勁,于是自己整理多方資料并總結(jié)一下自己的學習點滴和使用xmpp開發(fā)的一些方法,算是方便他人和自己學習和鞏固吧。
一、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ù)自己理解的翻譯,可能有些牽強,不足的地方請大牛指點。
XMPP 是一個擴展的消息和表示協(xié)議,是一系列的開源技術(shù)用于即時通訊、表示呈現(xiàn)、多方聊天、音頻和視頻通話、協(xié)作、輕量級中間組件、內(nèi)容聚合和xml數(shù)據(jù)通用路由。
也可以這樣理解用途:可用于服務類實時通訊、表示和需求響應服務中的XML數(shù)據(jù)元流式傳輸。
XMPP的前世今生
XMPP的前身是Jabber,一個開源形式組織產(chǎn)生的網(wǎng)絡即時通信協(xié)議。XMPP目前被IETF國際標準組織完成了標準化工作。標準化的核心結(jié)果分為兩部分:核心的XML流傳輸協(xié)議;基于XMLFreeEIM流傳輸?shù)募磿r通訊擴展應用。
Jabber 是著名的Linux即時通訊服務服務器,它是一個自由開源軟件,能讓用戶自己架即時通訊服務器,可以在Internet上應用,也可以在局域網(wǎng)中應用。
二、xmpp的優(yōu)勢
下面是對官方An Overview of XMPP關(guān)鍵點簡單翻譯總結(jié),感覺對全面了解xmpp很有用就寫在這里。
XMPP有何牛逼之處
1.開源:協(xié)議開源,且在客戶端、服務、服務組件和一些庫都有相應的實現(xiàn)。
2.標準化:IETF組織已經(jīng)標準化核心的xml流協(xié)議(RFC 6120, RFC 6121, and RFC 7622).
3.可靠的:目前以后上萬臺xmpp服務器在運行,百萬的的用戶正在使用以xmpp作為即時通訊。
4.去中心化:任何人都可以運行自己xmpp服務器,并且之間可以向發(fā)郵件一樣互聯(lián)。
5.安全:SASL 和 TLS安全協(xié)議已經(jīng)被規(guī)范到xmpp協(xié)議當中了。
6.可擴展性:強大的xml傳輸可以幫助我們在核心協(xié)議上任意擴展。
7.靈活性:xmpp不僅僅是聊天工具,還包括網(wǎng)絡管理、協(xié)作工具、文件共享、遠程監(jiān)控、web服務和云計算等。
8.多樣性:很多公司和開源項目都在使用XMPP技術(shù),所以在使用XMPP時你是不會陷入困境的。
XMPP的關(guān)鍵技術(shù)
1.核心:xml流的xmpp技術(shù)。
2.jingle:通過 Jingle 可以實現(xiàn)點對點(P2P)的多媒體交互會話控制
3.多人聊天:靈活的多人聊天。
4.訂閱通知:通知和訂閱
5.BOSH:一個擁有xmpp傳輸?shù)膆ttp綁定。
三、基于XMPP的即時通訊架構(gòu)
XMPP工作原理
XMPP中定義了三個角色,客戶端,服務器,網(wǎng)關(guān)。通信能夠在這三者的任意兩個之間雙向發(fā)生。服務器同時承擔了客戶端信息記錄,連接管理和信息的路由功能。

網(wǎng)關(guān)承擔著與異構(gòu)即時通信系統(tǒng)的互聯(lián)互通,異構(gòu)系統(tǒng)可以包括SMS(短信),MSN,ICQ等?;镜木W(wǎng)絡形式是單客戶端通過TCP/IP連接到單服務器,然后在之上傳輸XML。

XMPP和其他系統(tǒng)互聯(lián)通信架構(gòu)

XMPP具體通信過程

四、核心xml流協(xié)議
XMPP 的核心數(shù)據(jù)包類型有Precense,Message,Iq ,此外加上初始化 stream 用到的 Stream 數(shù)據(jù)包。這些數(shù)據(jù)包是 XMPP 信息傳輸?shù)妮d體,被用于 XMPP 核心功能和擴展功能的實現(xiàn)。
公有屬性
在 XML stream 中,每個數(shù)據(jù)包都是 XML 格式純文本。而每個 XML 數(shù)據(jù)包有以下公有屬性:
to: 數(shù)據(jù)包要發(fā)送的目的地址
from:數(shù)據(jù)包發(fā)送的源地址
id:數(shù)據(jù)包標示符
此三項屬性在 XML stanza 中最為常見。
to 和 from 屬性用于服務器決定該數(shù)據(jù)包的路由規(guī)則。某些情況下,to 和 from 屬性可以只有一個,例如:客戶端向服務端發(fā)送設置配置的 Iq 包只含有 to (不向外路由),客戶端向聯(lián)系人發(fā)送 Message 只含有 to (from 屬性總是被改寫為客戶端的地址)。
id 用于節(jié)點間判斷請求和應答數(shù)據(jù)包的對應狀況,大多數(shù)情況可以不處理。
初始化 XML stream,身份驗證
在客戶端與服務器產(chǎn)生 TCP 連接后,需要與服務器初始化 XML stream,以及進行身份驗證。
初始化時,客戶端發(fā)送 stream 頭部 XML:

服務器在收到客戶端的 stream 頭后,回應一個 stream 頭:

接著服務器向客戶端發(fā)送服務端支持的身份驗證方式列表,常見的方式有基于安全傳輸 SASL 的 BASE64 編碼賬戶密碼驗證。身份驗證的種類多樣。
打開stream流對話后客戶端和服務端就可以開始會話了,比如我想問服務端獲取我的好友列表,我就可以向服務器發(fā)送下文中的get類型Iq數(shù)據(jù)包。
客戶端:

該請求的意義為:名為 sawyer 的用戶 (登錄資源為 iOS) 向 example.com 服務器請求獲得 (get) roster 表。
服務器收到請求后,返回 roster 表。
服務端:

可以看到,sawyer 的 roster 表內(nèi)有3個聯(lián)系人,分別名為 Romeo,Mercutio,Benvolio,都屬于 Friends 分組。Roster 列表中的 JID 信息將會用在稍候客戶端發(fā)送信息包的目的地址中。
Item 中的 subscription 關(guān)系到聯(lián)系人狀態(tài)信息的傳輸,有 none,both,from,to 四種。詳細的 subscription 操作在 RFC 3921Managing Subscriptions 章節(jié)[7]中定義。
獲取完好友列表,我就可以給我的Romeo好友發(fā)個問候了,Message 是即時聊天應用中最常用的數(shù)據(jù)包,其功能是發(fā)送用戶聊天信息。一個 Message 例子如下:
客戶端:

該 message 包將會被服務器轉(zhuǎn)發(fā)至 example.net 服務器,隨后轉(zhuǎn)交給 romeo 已登錄的客戶端上(如果該用戶沒有登錄,message 信息會儲存在服務端直至用戶上線)。
其中,body 標簽中包含用戶要傳輸?shù)牧奶煨畔ⅰ?/p>
要傳輸格式化的富文本信息,可以通過支持擴展 XEP-0071[8],引入 html 標簽。
用戶不想聊天了,想關(guān)閉會話。
在對話結(jié)束時,客戶端和服務端要先后發(fā)送 stream 尾部 XML,以使整個 XMP stream 閉合。(如果 TCP 異常中斷,則服務端直接中斷對話)
客戶端:
</stream:stream>
服務端:
</stream:stream>
五、常用的服務端和前端框架
iOS常用框架及開源作品
1.iOS端常用框架:https://github.com/robbiehanson/XMPPFramework
2.個人感覺不錯的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.不錯的安卓開源作品:https://github.com/jiangzehui/xmpp
服務端比較常用的聊天服務器。
1.java語言實現(xiàn)的服務器Openfire
openfire采用嵌入式Jetty服務器(相對tomcat而言)集成到工程里,安裝完程序,開啟服務即可使用。
源碼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語言實現(xiàn)的服務器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)圖來源均為網(wǎng)上。