XMPP新手上路

關(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)上。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渔隶,一起剝皮案震驚了整個(gè)濱河市羔挡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌间唉,老刑警劉巖绞灼,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異呈野,居然都是意外死亡低矮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門被冒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)军掂,“玉大人,你說(shuō)我怎么就攤上這事昨悼』茸叮” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵率触,是天一觀的道長(zhǎng)终议。 經(jīng)常有香客問(wèn)我,道長(zhǎng)葱蝗,這世上最難降的妖魔是什么穴张? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮两曼,結(jié)果婚禮上皂甘,老公的妹妹穿的比我還像新娘。我一直安慰自己合愈,他們只是感情好叮贩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布击狮。 她就那樣靜靜地躺著佛析,像睡著了一般。 火紅的嫁衣襯著肌膚如雪彪蓬。 梳的紋絲不亂的頭發(fā)上寸莫,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音档冬,去河邊找鬼膘茎。 笑死桃纯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的披坏。 我是一名探鬼主播态坦,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼伞梯!你這毒婦竟也來(lái)了帚屉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤喻旷,失蹤者是張志新(化名)和其女友劉穎牢屋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伟阔,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年怀估,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了多搀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡康铭,死狀恐怖从藤,靈堂內(nèi)的尸體忽然破棺而出锁蠕,到底是詐尸還是另有隱情,我是刑警寧澤荣倾,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站妒貌,受9級(jí)特大地震影響通危,放射性物質(zhì)發(fā)生泄漏菊碟。R本人自食惡果不足惜在刺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一增炭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隙姿,春花似錦、人聲如沸队丝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)膘盖。三九已至尤误,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間软棺,已是汗流浹背尤勋。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘦棋,地道東北人锌奴。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓鹿蜀,卻偏偏與公主長(zhǎng)得像箕慧,于是被迫代替她去往敵國(guó)和親颠焦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子往枣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理圾另,服務(wù)發(fā)現(xiàn),斷路器集乔,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • XMPP簡(jiǎn)介 XMPP協(xié)議簡(jiǎn)介 XMPP協(xié)議(Extensible Messaging and PresenceP...
    不規(guī)則先生閱讀 6,304評(píng)論 2 31
  • 關(guān)于XMPP最權(quán)威的講解:http://www.jabbercn.org/RFC3920(這個(gè)才是最權(quán)威的扰路,下面文...
    隨風(fēng)飄蕩的小逗逼閱讀 1,490評(píng)論 1 5
  • 回到相遇的地點(diǎn) 才知我對(duì)你不了解 以為愛得深就不怕傷悲 偏偏愛讓心成雪 我獨(dú)自走在寂寞的長(zhǎng)街 回憶一幕幕重演 我告...
    趙小煥閱讀 501評(píng)論 0 0
  • 我是一只穿山甲汗唱,我的日常就是睡覺哩罪,抓螞蟻巡验,吃螞蟻,一窩一窩的抓起來(lái)吃腹鹉,嘎嘣嘎嘣的可香了敷硅。 所有的螞蟻都見我就跑,不...
    胖嘟嘟的長(zhǎng)頸鹿閱讀 649評(píng)論 0 2