XMPP新手上路

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容