XMPP簡(jiǎn)介
XMPP協(xié)議簡(jiǎn)介
XMPP協(xié)議(Extensible Messaging and PresenceProtocol颁糟,可擴(kuò)展消息處理現(xiàn)場(chǎng)協(xié)議)是一種基于XML的協(xié)議欧瘪,目的是為了解決及時(shí)通信標(biāo)準(zhǔn)而提出來(lái)的尚困,最早是在Jabber上實(shí)現(xiàn)的量没。它繼承了在XML環(huán)境中靈活的發(fā)展性。因此钢属,基于XMPP的應(yīng)用具有超強(qiáng)的可擴(kuò)展性熔萧。并且XML很易穿過(guò)防火墻,所以用XMPP構(gòu)建的應(yīng)用不易受到防火墻的阻礙洪唐。利用XMPP作為通用的傳輸機(jī)制钻蹬,不同組織內(nèi)的不同應(yīng)用都可以進(jìn)行有效的通信。最初凭需,XMPP作為一個(gè)框架開(kāi)發(fā)问欠,目標(biāo)是支持企業(yè)環(huán)境內(nèi)的即時(shí)消息傳遞和聯(lián)機(jī)狀態(tài)應(yīng)用程序。當(dāng)時(shí)的即時(shí)消息傳遞網(wǎng)絡(luò)是私有的粒蜈,非常不適合企業(yè)使用顺献。例如,AOL Instant Messenger不能針對(duì)公司內(nèi)的安全通信進(jìn)行調(diào)整枯怖。盡管存在一些商業(yè)解決方案注整,但他們固定的特性集通常不能進(jìn)行調(diào)整,以滿足組織的特殊需求度硝。XMPP肿轨,當(dāng)時(shí)名為Jabber,允許組織構(gòu)建自己的定制工具來(lái)促進(jìn)實(shí)時(shí)通信塘淑,并允許安裝現(xiàn)成的第三方解決方案萝招。
?XMPP協(xié)議特點(diǎn)
1)所有XMPP信息都是以XML為基礎(chǔ)的,信息交換的事實(shí)標(biāo)準(zhǔn),擴(kuò)展性強(qiáng)
2)XMPP系統(tǒng)是一個(gè)分布式系統(tǒng),每臺(tái)服務(wù)器控制自己的資源热鞍,但是如果需要,它能與外在的系統(tǒng)進(jìn)行通信岗钩。XMPP服務(wù)器利用開(kāi)放的XML協(xié)議來(lái)進(jìn)行S2S(Serverto Server)通信,就像在C2S(Client to Server)一樣肖油。相比之下兼吓,大多數(shù)的IM系統(tǒng)使用了只是支持C2S/S2C通信的協(xié)議,因此Jabber/XMPP服務(wù)器具有更大的靈活性森枪。
3)XMPP協(xié)議是公開(kāi)的视搏,程序則開(kāi)放源代碼。定義了客戶端和服務(wù)器端的交互要經(jīng)由XML流县袱。普通消息類型(message)浑娜,如改變狀態(tài)(presence),傳遞消息內(nèi)容或查詢/更新(info/quey)應(yīng)用則用每個(gè)指定的命名空間(namespace)來(lái)建立式散。
4)狀態(tài)(Presence)在整個(gè)持久連接中筋遭。通過(guò)持久連接的有效維持,XMPP協(xié)議一直有在網(wǎng)絡(luò)中維持存在和可用信息的能力。
5)XMPP允許建立并行的TCP套接字連接對(duì)所有連接上的客戶端和服務(wù)器端漓滔。一旦建立連接编饺,則只有當(dāng)狀態(tài)改變,例如存在的改變响驴,通過(guò)這個(gè)連接傳輸數(shù)據(jù)透且。既然這個(gè)連接是持久的,那么設(shè)置豁鲤、認(rèn)證石蔗、狀態(tài)查找功能都不用每次都重復(fù)執(zhí)行。這種持久的套接字的連接使得XMPP能夠更有效的支持高級(jí)的具有存在能力的應(yīng)用在帶寬和處理資源的使用中畅形。
6)Jabber/XMPP系統(tǒng)是模塊化的,而且Jabber/XMPP的設(shè)計(jì)強(qiáng)調(diào)如何實(shí)現(xiàn)可伸縮性诉探、安全性和可擴(kuò)展性日熬。 XMPP協(xié)議分析? ? ? 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的基本網(wǎng)絡(luò)結(jié)構(gòu)如下:C1----S1---S2---C3|C2----+--G1===FN1===FC1符號(hào)表示:C1,C2,C3=XMPP客戶端陆爽;S1,S2=XMPP什往;服務(wù)端G1=在XMPP和使用外部消息網(wǎng)絡(luò)(非XMPP)的協(xié)議之間轉(zhuǎn)換的網(wǎng);FN1=外部消息網(wǎng)絡(luò)慌闭;FC1=外部消息網(wǎng)絡(luò)的客戶端别威。
?(1)服務(wù)器服務(wù)系統(tǒng)是XMPP通信的智能提取層,它主要負(fù)責(zé):管理來(lái)自其他個(gè)體的會(huì)話連接或者XML流(streams)和來(lái)自客戶端驴剔、服務(wù)器省古、其他個(gè)體的認(rèn)證發(fā)送在XML流實(shí)體之中的適當(dāng)?shù)腦ML地址節(jié)點(diǎn)。大多數(shù)XMPP服務(wù)都允許存儲(chǔ)一些客戶端數(shù)據(jù)(比如聯(lián)系人列表)仔拟,在這種情況下衫樊,服務(wù)直接面向這個(gè)客戶端處理XML數(shù)據(jù),而不是其他個(gè)體。
(2)客戶端大多數(shù)客戶端是通過(guò)TCP直接連接科侈,并且使用XMPP獲得服務(wù)器提供全部-12-第2章Jabber協(xié)議原理及其應(yīng)用功能和其他服務(wù)载佳。許多資源通過(guò)認(rèn)證的客戶端也許同時(shí)連接到服務(wù)器,定義在XMPP地址的每個(gè)資源是不同的(比如和)建議服務(wù)器和客戶端采用的端中是5222臀栈。
(3)網(wǎng)關(guān)
它的主要功能是將XMPP協(xié)議轉(zhuǎn)換成外部消息(non-XMPP)系統(tǒng)使用的協(xié)議,也將返回的數(shù)據(jù)轉(zhuǎn)換成XMPP蔫慧。這些通信是基于網(wǎng)關(guān)和服務(wù)器,基于網(wǎng)關(guān)和外部消息系統(tǒng)之間的权薯。
XMPP 通信的結(jié)構(gòu)
要促進(jìn)消息傳遞姑躲,每個(gè) XMPP 客戶端用戶必須擁有一個(gè)全局惟一標(biāo)識(shí)符∶蓑迹基于歷史原因黍析,這些標(biāo)識(shí)符稱為 Jabber IDs,或稱為 JIDs屎开。鑒于這個(gè)協(xié)議的分布式特征阐枣,重要的是 JID 應(yīng)包含聯(lián)系用戶所需的所有信息:不存在將用戶鏈接到他們連接到的服務(wù)器的中央知識(shí)庫(kù)。JID 的結(jié)構(gòu)類似于電子郵件地址(但不要求 JID 同時(shí)也是有效的電子郵件收件人)奄抽。
客戶端和服務(wù)器節(jié)點(diǎn)蔼两,我將它們統(tǒng)稱為 XMPP 實(shí)體,都擁有 JIDs逞度。SomeCorp 公司的員工 John Doe 可能擁有 JID John.Doe@somecorp.com额划。這里,somecorp.com 是 SomeCorp 公司的 XMPP 服務(wù)器的地址档泽,John.Doe 是 John Doe 的用戶名俊戳。
JIDs 還擁有連接到它們的資源。這允許在一個(gè) XMPP 實(shí)體標(biāo)識(shí)符之外進(jìn)一步處理細(xì)粒度馆匿;例如品抽,盡管上面的示例總體上能夠表示 John Doe,但 John.Doe@somecorp.com/Work 可以用于將數(shù)據(jù)發(fā)送到與他的工作相關(guān)的工具甜熔。
這些資源可以采用任意用戶定義的名稱圆恤,一個(gè) XMPP 實(shí)體可以擁有任意數(shù)量的資源。除了可以是上下文依賴的外腔稀,它們還可以綁定到設(shè)備盆昙、工具或工作站。對(duì)于您的 Pingstream 示例焊虏,web 站點(diǎn)的每個(gè)訪問(wèn)者都將作為同一個(gè)用戶登錄 XMPP 服務(wù)器淡喜,但他們擁有不同的資源。
通信類別
使用 XMPP 的實(shí)時(shí)消息傳遞系統(tǒng)包含三大通信類別:
消息傳遞诵闭,其中數(shù)據(jù)在有關(guān)各方之間傳輸炼团;一個(gè)即時(shí)消息系統(tǒng)最基本的功能就是能夠在兩個(gè)用戶之間實(shí)時(shí)交換消息澎嚣,</message>元素就提供了這個(gè)功能。每條消息都有一個(gè)或多個(gè)屬性和子元素瘟芝。屬性“from”和“to”分別表示了消息發(fā)送者和接收者的地址易桃。也可以包含一個(gè)“type”屬性,這給接收者一個(gè)提示锌俱,這個(gè)消息是什么樣的消息晤郑。表3-1給出了“type”屬性的可能取值。中也可以包含“id”屬性贸宏,用來(lái)唯一的標(biāo)識(shí)一個(gè)輸出消息的響應(yīng)造寝。
聯(lián)機(jī)狀態(tài),它允許用戶廣播其在線狀態(tài)和可用性吭练;</presence>元素用來(lái)傳遞一個(gè)用戶的存在狀態(tài)的感知信息诫龙。用戶可以是“available”,要么是“unavailable”鲫咽,“Hide”等赐稽。當(dāng)用戶連接到即時(shí)消息服務(wù)器后,好友發(fā)給他的消息就立即被傳遞浑侥。如果用戶沒(méi)有連接到服務(wù)器,好友發(fā)給他的消息將被服務(wù)器存儲(chǔ)起來(lái)直到用戶連接到服務(wù)器晰绎。用戶通過(guò)即時(shí)消息客戶端自己控制可用性寓落。但是,如果用戶斷開(kāi)了同服務(wù)器的連接荞下,服務(wù)器將發(fā)送給訂閱了這個(gè)用戶的存在信息的用戶通知他們用戶已經(jīng)不可用伶选。還包含了兩個(gè)子元素:和。包含了一個(gè)對(duì)的文本描述尖昏。
信息/查詢請(qǐng)求仰税,它允許 XMPP 實(shí)體發(fā)起請(qǐng)求并從另一個(gè)實(shí)體接收響應(yīng)。IQ元素是Jabber/XMPP消息協(xié)議的第三個(gè)頂層元素抽诉。IQ代表"Info/Query"陨簇,用來(lái)發(fā)送和獲取實(shí)體之間的信息。IQ消息是通過(guò)“請(qǐng)求/響應(yīng)”機(jī)制在實(shí)體間進(jìn)行交換的迹淌。IQ元素用于不同的目的河绽,它們之間通過(guò)不同的命名空間來(lái)加以區(qū)分。在Jabber/XMPP消息協(xié)議里有許多的命名空間唉窃,但最常用的命名空間是:"jabber:iq:register","jabber:iq:auth","jabber:iq:roster"
這些類別是互補(bǔ)的耙饰。例如,如果用戶或?qū)嶓w離線(盡管在許多用例中纹份,理想的狀態(tài)是服務(wù)器在用戶返回之前一直持有用戶的消息)苟跪,則沒(méi)有將數(shù)據(jù)發(fā)送給用戶或發(fā)起一個(gè)實(shí)體的信息/查詢請(qǐng)求的點(diǎn)廷痘。
這些消息中的每一條都將通過(guò)一個(gè)完整的 XML 節(jié) 傳遞 — XML 節(jié)是以 XML 表達(dá)的獨(dú)立信息項(xiàng)。
這三種類型的 XMPP 節(jié)都擁有以下公共屬性:
from:源 XMPP 實(shí)體的 JID件已;
to:目標(biāo)接收者的 JID笋额;
id:這次對(duì)話的可選標(biāo)識(shí)符;
type:節(jié)的可選子類型拨齐;
xml:lang:如果內(nèi)容是人們可讀的鳞陨,則為消息語(yǔ)言的描述。
基于 XMPP 的數(shù)據(jù)傳輸發(fā)生在一些 XML 流上瞻惋,默認(rèn)在端口 5222 上操作厦滤。這些 XML 流實(shí)際上是兩個(gè)完整的 XML 文檔,每個(gè)文檔對(duì)應(yīng)一個(gè)通信方向歼狼。一旦會(huì)話建立掏导,stream 元素將打開(kāi)。這個(gè)元素將封裝整個(gè)通信文檔羽峰。然后趟咆,一些節(jié)被注入這個(gè)文檔的第二層。最后梅屉,一旦通信結(jié)束值纱,stream 元素將關(guān)閉,形成一個(gè)完整的文檔坯汤。上面描述了Jabber協(xié)議的三個(gè)頂層節(jié)點(diǎn)虐唠。通過(guò)這種格式Jabber消息不僅可以是簡(jiǎn)單的文本(text),而且可以攜帶復(fù)雜的數(shù)據(jù)和各種格式的文件惰聂,也就是說(shuō)Jabber不僅可以用在人與人之間的交流疆偿,而且可以實(shí)現(xiàn)軟件與軟件或軟件與人之間的交流。Jabber的這種功能大大擴(kuò)展了即時(shí)通信的應(yīng)用范圍搓幌。
XMPP工作機(jī)制??
? ? 例如:一個(gè)終端名字是Remeo杆故,通過(guò)服務(wù)器montague.lit與其他的用戶相連,其他的用戶通過(guò)服務(wù)器juliet@capulet.lit建立連接溉愁。
第一步Romeo開(kāi)始通過(guò)發(fā)送一個(gè)stream包與服務(wù)器montague.lit取得聯(lián)系处铛,這一步包含了鑒權(quán),登錄等等拐揭。
第二步Romeo獲取了他的聯(lián)系人列表罢缸,通過(guò)向服務(wù)器montague.lit發(fā)送字段請(qǐng)求,按照下面的協(xié)議投队。
第三步Romeo發(fā)送了一個(gè)presence請(qǐng)求到服務(wù)器montague.lit枫疆,然后會(huì)將這個(gè)信息廣播到他的所有好友。
第四步如果Romeo的聯(lián)系人都在線敷鸦,就會(huì)將presence回復(fù)給Romeo息楔,告知自己的狀態(tài)寝贡。
第五步Romeo和Juliet開(kāi)始交換信息,進(jìn)行聊天值依。hi!hi yourself!以文檔的觀點(diǎn)來(lái)看圃泡,客戶端或服務(wù)器發(fā)送的所有XML文本連綴在一起,從到構(gòu)成了一個(gè)完整的XML文檔愿险。其中的stream標(biāo)簽就是所謂的XML Stream颇蜡。在與中間的那些...這樣的XML元素就是所謂的XML Stanza(XML節(jié))。
XMPP核心協(xié)議通信的基本模式就是先建立一個(gè)stream辆亏,然后協(xié)商一堆安全之類的東西风秤,中間通信過(guò)程就是客戶端發(fā)送XML Stanza,一個(gè)接一個(gè)的扮叨。服務(wù)器根據(jù)客戶端發(fā)送的信息以及程序的邏輯缤弦,發(fā)送XML Stanza給客戶端。但是這個(gè)過(guò)程并不是一問(wèn)一答的彻磁,任何時(shí)候都有可能從一個(gè)方發(fā)信給另外一方碍沐。通信的最后階段是關(guān)閉流,關(guān)閉TCP/IP連接衷蜓。
XMPP 使用 BOSH 越過(guò) HTTP
要通過(guò)使用 JavaScript 的 XMPP 進(jìn)行通信的 web 應(yīng)用程序必須符合一些特殊要求累提。出于安全考慮,不允許 JavaScript 從 web 頁(yè)面的域與不同域上的多個(gè)服務(wù)器通信磁浇。如果您的 web 應(yīng)用程序界面被托管在 application.mydomain.com斋陪,所有 XMPP 通信也必須發(fā)生在 application.mydomain.com。
防火墻是另一個(gè)問(wèn)題所在扯夭。理想情況下,如果您將 XMPP 用作您的 web 界面的實(shí)時(shí)元素的基礎(chǔ)鞍匾,那么您希望它對(duì)防火墻后面的用戶有效交洗。但是,公司防火墻通常只對(duì)少數(shù)幾個(gè)協(xié)議開(kāi)放幾個(gè)端口橡淑,以便允許 web 數(shù)據(jù)构拳、電子郵件和類似的通信通過(guò)。默認(rèn)情況下梁棠,XMPP 使用端口 5222置森,這很可能是公司防火墻阻止的端口。
假設(shè)您知道您的用戶前面的防火墻在端口 80 上允許 HTTP(這是用于訪問(wèn) web 的默認(rèn)協(xié)議和端口)符糊。理想情況是您的 XMPP 通信能夠越過(guò)該端口上的 HTTP凫海。但是,HTTP 的設(shè)計(jì)并不針對(duì)持續(xù)連接男娄。web 的架構(gòu)不同于實(shí)時(shí)數(shù)據(jù)所需的通信架構(gòu)行贪。
下面我們看看 Bidirectional-streams Over Synchronous HTTP (BOSH) 的標(biāo)準(zhǔn)漾稀,該標(biāo)準(zhǔn)為雙向同步數(shù)據(jù)提供一個(gè)模擬層。借助這個(gè)標(biāo)準(zhǔn)建瘫,可以與一個(gè) XMPP 服務(wù)器建立一個(gè)較長(zhǎng)的 HTTP 連接(時(shí)長(zhǎng)一分鐘或兩分鐘)崭捍。如果新數(shù)據(jù)在那個(gè)期間到達(dá),則 HTTP 請(qǐng)求返回?cái)?shù)據(jù)并關(guān)閉啰脚;否則殷蛇,該請(qǐng)求只是失效。不管是哪種情況橄浓,一旦一個(gè)請(qǐng)求關(guān)閉粒梦,另一個(gè)請(qǐng)求將重新建立。盡管結(jié)果是對(duì)一個(gè) web 服務(wù)器的一系列重復(fù)連接贮配,但它是一個(gè)比 Ajax 輪詢更有效的數(shù)量級(jí)谍倦,特別是因?yàn)檫B接到的是一個(gè)專業(yè)服務(wù)器而不是直接連接到 web 應(yīng)用程序。
BOSH 上的 XMPP 允許 web 應(yīng)用程序通過(guò)一個(gè)原生連接持續(xù)與 XMPP 服務(wù)器通信泪勒≈缰客戶端通過(guò)端口 80 上的 HTTP 上的一個(gè)標(biāo)準(zhǔn) URL 連接。然后圆存,web 服務(wù)器將這個(gè)連接代理到由 XMPP 服務(wù)器操作的一個(gè)不同端口 — 通常是 7070 — 上的 HTTP URL叼旋。這樣,無(wú)論何時(shí)數(shù)據(jù)被發(fā)送到 XMPP 服務(wù)器沦辙,web 應(yīng)用程序只需使用一些資源夫植,而 web 客戶端可以使用通常支持的 web 標(biāo)準(zhǔn)從防火墻后操作。維持 BOSH 的較長(zhǎng) HTTP 輪詢的開(kāi)銷主要由 XMPP 服務(wù)器而不是 web 服務(wù)器或 web 應(yīng)用程序承擔(dān)油讯。web 服務(wù)器和 XMPP 服務(wù)器都不會(huì)受到與使用 JavaScript 進(jìn)行通信一樣的域限制详民,正是因?yàn)檫@一點(diǎn),消息才能夠被發(fā)送到其他 XMPP 服務(wù)器和客戶端陌兑。
現(xiàn)在沈跨,您理解了 XMPP 如何適合實(shí)時(shí) web,可以下載并設(shè)置它兔综,以便開(kāi)始創(chuàng)建這個(gè) Pingstream 應(yīng)用程序饿凛。
XMPP 架構(gòu)
XMPP 與其他的應(yīng)用層協(xié)議(如SMTP)有著相似之處。在這些架構(gòu)中软驰,具有惟一名稱的客戶機(jī)通過(guò)相關(guān)的服務(wù)器與另外一個(gè)具有惟一名稱的客戶機(jī)進(jìn)行通信涧窒。每個(gè)客戶機(jī)執(zhí)行客戶機(jī)的協(xié)議表單,而服務(wù)器在表單中提供路由功能锭亏。
圖 1 說(shuō)明了這個(gè)簡(jiǎn)單的架構(gòu)纠吴。
在這個(gè)例子中,每個(gè)客戶機(jī)都是同一個(gè)域名(discovery.nasa.guv)的一部分慧瘤。
圖 1. 由一個(gè)服務(wù)器和兩個(gè)客戶機(jī)組成的簡(jiǎn)單的 XMPP 架構(gòu)由一個(gè)服務(wù)器和兩個(gè)客戶機(jī)組成的簡(jiǎn)單 XMPP 架構(gòu)的圖表服務(wù)器還可以針對(duì)不同域之間(例如呜象,在 discovery.nasa.guv 和 europa.nasa.guv 之間)的路由進(jìn)行通信膳凝。此外,網(wǎng)關(guān)可用于在外部消息傳遞域和協(xié)議之間進(jìn)行轉(zhuǎn)換恭陡。
圖 2 中的示例顯示了一個(gè) XMPP 網(wǎng)絡(luò)蹬音,網(wǎng)關(guān)通往一個(gè)短信服務(wù)(SMS)域和一個(gè) SMTP 域。在這種情況下休玩,網(wǎng)關(guān)大多數(shù)都是被用來(lái)在 IM 協(xié)議(例如著淆,在 XMPP 和 Internet 中繼聊天(IRC))之間進(jìn)行轉(zhuǎn)換。作為一個(gè)可擴(kuò)展的協(xié)議拴疤,XMPP 對(duì)于在不同的端點(diǎn)協(xié)議間提供統(tǒng)一連接性來(lái)說(shuō)是一個(gè)理想的中樞協(xié)議永部。XMPP 網(wǎng)關(guān)允許終止一個(gè)給定的客戶端到服務(wù)器的會(huì)話,并且向目標(biāo)端點(diǎn)協(xié)議發(fā)起一個(gè)新的會(huì)話(同時(shí)進(jìn)行必要的協(xié)議轉(zhuǎn)換)呐矾。
圖 2. 包含了 XMPP 網(wǎng)關(guān)的更為復(fù)雜的 XMPP 架構(gòu)更為復(fù)雜的 XMPP 架構(gòu)圖苔埋,包含了連接到 SMS 和 SMTP 客戶端和服務(wù)器的 XMPP 網(wǎng)關(guān)回頁(yè)首XMPP 中的地址XMPP 中的地址(即 Jabber ID[JID])與標(biāo)準(zhǔn)電子郵件地址相似,但有著幾個(gè)顯著的差別蜒犯。JID 包含一個(gè)可選節(jié)點(diǎn)组橄、一個(gè)域和一個(gè)可選資源:[ node "@" ] domain [ "/" resource ]最常見(jiàn)的用法就是定義一個(gè) IM 用戶(類似電子郵件地址),比如 DavidBowman@discovery.nasa.guv罚随。用戶能夠多次登錄 XMPP 服務(wù)器玉工,而在這個(gè)例子中,資源能夠表示位置淘菩。例如遵班,示例用戶可能有一個(gè)主終端(DavidBowman@discovery.nasa.guv/terminal)JID 和另外一個(gè)來(lái)自 EVA pod(DavidBowman@discovery.nasa.guv/eva_pod1)的 JID。因此潮改,能夠找到某個(gè)特定位置狭郑,或離開(kāi)此位置并找到用戶,不管用戶在哪個(gè)位置登錄汇在『踩回頁(yè)首XMPP 協(xié)議XMPP 是一個(gè)相對(duì)簡(jiǎn)單的協(xié)議,它通過(guò) XML 消息出現(xiàn)在 TCP 套接字上趾疚。異步通信發(fā)生在 XML 流中缨历,并帶有 XML 節(jié)(stanza)以蕴。XML 流 是封裝了兩個(gè)實(shí)體間的 XML 信息交換的容器糙麦。XML 流傳遞 XML 節(jié),這些 XML 節(jié)是一些分散的信息單元丛肮。例如赡磅,在 XMPP 中使用 XML 節(jié)傳遞消息(IM 用戶間的文本)以及到場(chǎng)信息。為說(shuō)明這些概念宝与,請(qǐng)看一個(gè)在兩個(gè)客戶端之間使用 XMPP 進(jìn)行 IM 通信的簡(jiǎn)單示例焚廊。
圖 3 演示了兩個(gè)實(shí)體之間的簡(jiǎn)單會(huì)話冶匹。注意,至少有一個(gè)服務(wù)器會(huì)出現(xiàn)在會(huì)話中(在這個(gè)例子中咆瘟,因?yàn)閮蓚€(gè)客戶端存在于同一個(gè)域中嚼隘,所以準(zhǔn)確地說(shuō),只有一個(gè)服務(wù)器)袒餐。在 圖 3 中飞蛹,左邊的客戶端是發(fā)起實(shí)體(發(fā)起兩個(gè)實(shí)體間的 XMPP 通信)。XML 流使用 to 屬性來(lái)識(shí)別接收域(以及定義 XML 名稱空間)灸眼。右邊的接收客戶端 接收 XML 流并使用 XML 流響應(yīng)(在這個(gè)例子中卧檐,使用 from 屬性)進(jìn)行回應(yīng)。在這個(gè)階段焰宣,可以進(jìn)行幾個(gè)不同的協(xié)商(如驗(yàn)證和加密)霉囚。請(qǐng)忽略這部分討論(例外情況是當(dāng) IM 客戶端出現(xiàn)在不同的域中進(jìn)行服務(wù)器到服務(wù)器通信)。(請(qǐng)查看 圖 3 的文字版本匕积。)圖 3. 示例(簡(jiǎn)化的)XMPP 通信示例(簡(jiǎn)化的)XMPP 通信圖圖 3 中的 XML 流的下一步是進(jìn)行消息傳遞盈罐。這個(gè)通信在消息節(jié)中進(jìn)行,并且包括了源和目標(biāo) XMPP 地址(from 和 to)闸天、使用的語(yǔ)言以及節(jié)正文中的消息暖呕。對(duì)方用其自己的消息進(jìn)行響應(yīng),關(guān)鍵區(qū)別是源和目標(biāo) XMPP 地址苞氮。最后湾揽,發(fā)出流關(guān)閉消息(在連接的兩端進(jìn)行)以關(guān)閉 XML 流。任何一邊都可能返回一個(gè)錯(cuò)誤笼吟,如下面所定義库物。
在本例中,對(duì)方發(fā)送了一個(gè)無(wú)效的 XML 流和節(jié)贷帮。盡管這個(gè)示例展示了簡(jiǎn)單的 IM 通信戚揭,但很容易就能了解消息節(jié)是如何轉(zhuǎn)換成 RPC 消息的,同時(shí)負(fù)載了來(lái)自對(duì)等協(xié)商的安全問(wèn)題撵枢。您可以把函數(shù)注冊(cè)為節(jié)點(diǎn)民晒,以創(chuàng)建一個(gè)動(dòng)態(tài)的 Web 服務(wù)框架,而不是對(duì)域中的用戶進(jìn)行注冊(cè)锄禽。
XMPP通過(guò)TCP傳的是什么
傳輸?shù)氖桥c即時(shí)通訊相關(guān)的指令潜必。在以前這些命令要么用2進(jìn)制的形式發(fā)送(比如QQ),要么用純文本指令加空格加參數(shù)加換行苻的方式發(fā)送(比如MSN)沃但。而XMPP傳輸?shù)募磿r(shí)通訊指令的邏輯與以往相仿磁滚,只是協(xié)議的形式變成了XML格式的純文本。這不但使得解析容易了,人也容易閱讀了垂攘,方便了開(kāi)發(fā)和查錯(cuò)维雇。而XMPP的核心部分就是一個(gè)在網(wǎng)絡(luò)上分片斷發(fā)送XML的流協(xié)議。這個(gè)流協(xié)議是XMPP的即時(shí)通訊指令的傳遞基礎(chǔ)晒他,也是一個(gè)非常重要的可以被進(jìn)一步利用的網(wǎng)絡(luò)基礎(chǔ)協(xié)議吱型。所以可以說(shuō),XMPP用TCP傳的是XML流陨仅。
XMPP的相關(guān)文檔
推薦一個(gè)包含XMPP相關(guān)資料的百度空間:http://hi.baidu.com/jabber/home
XMPP官網(wǎng):http://xmpp.org/
Jabber官網(wǎng)唁影,包含許多XMPP的實(shí)現(xiàn):http://www.jabber.org/