XMPP 與其他的應(yīng)用層協(xié)議(如SMTP)有著相似之處仆葡。在這些架構(gòu)中帕膜,具有惟一名稱的客戶機(jī)通過相關(guān)的服務(wù)器與另外一個具有惟一名稱的客戶機(jī)進(jìn)行通信伶椿。每個客戶機(jī)執(zhí)行客戶機(jī)的協(xié)議表單月褥,而服務(wù)器在表單中提供路由功能等浊。
圖 1 說明了這個簡單的架構(gòu)欲诺。
在這個例子中抄谐,每個客戶機(jī)都是同一個域名(discovery.nasa.guv)的一部分。
圖 1. 由一個服務(wù)器和兩個客戶機(jī)組成的簡單的 XMPP 架構(gòu)由一個服務(wù)器和兩個客戶機(jī)組成的簡單 XMPP 架構(gòu)的圖表服務(wù)器還可以針對不同域之間(例如扰法,在 discovery.nasa.guv 和 europa.nasa.guv 之間)的路由進(jìn)行通信斯稳。此外,網(wǎng)關(guān)可用于在外部消息傳遞域和協(xié)議之間進(jìn)行轉(zhuǎn)換迹恐。
圖 2 中的示例顯示了一個 XMPP 網(wǎng)絡(luò)挣惰,網(wǎng)關(guān)通往一個短信服務(wù)(SMS)域和一個 SMTP 域。在這種情況下殴边,網(wǎng)關(guān)大多數(shù)都是被用來在 IM 協(xié)議(例如憎茂,在 XMPP 和 Internet 中繼聊天(IRC))之間進(jìn)行轉(zhuǎn)換。作為一個可擴(kuò)展的協(xié)議锤岸,XMPP 對于在不同的端點(diǎn)協(xié)議間提供統(tǒng)一連接性來說是一個理想的中樞協(xié)議竖幔。XMPP 網(wǎng)關(guān)允許終止一個給定的客戶端到服務(wù)器的會話,并且向目標(biāo)端點(diǎn)協(xié)議發(fā)起一個新的會話(同時進(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)回頁首XMPP 中的地址XMPP 中的地址(即 Jabber ID[JID])與標(biāo)準(zhǔn)電子郵件地址相似,但有著幾個顯著的差別蛋铆。JID 包含一個可選節(jié)點(diǎn)馋评、一個域和一個可選資源:[ node "@" ] domain [ "/" resource ]最常見的用法就是定義一個 IM 用戶(類似電子郵件地址),比如 DavidBowman@discovery.nasa.guv刺啦。用戶能夠多次登錄 XMPP 服務(wù)器留特,而在這個例子中,資源能夠表示位置玛瘸。例如蜕青,示例用戶可能有一個主終端(DavidBowman@discovery.nasa.guv/terminal)JID 和另外一個來自 EVA pod(DavidBowman@discovery.nasa.guv/eva_pod1)的 JID。因此糊渊,能夠找到某個特定位置右核,或離開此位置并找到用戶,不管用戶在哪個位置登錄渺绒『睾龋回頁首XMPP 協(xié)議XMPP 是一個相對簡單的協(xié)議菱鸥,它通過 XML 消息出現(xiàn)在 TCP 套接字上。異步通信發(fā)生在 XML 流中搜变,并帶有 XML 節(jié)(stanza)采缚。XML 流 是封裝了兩個實(shí)體間的 XML 信息交換的容器。XML 流傳遞 XML 節(jié)挠他,這些 XML 節(jié)是一些分散的信息單元扳抽。例如,在 XMPP 中使用 XML 節(jié)傳遞消息(IM 用戶間的文本)以及到場信息殖侵。為說明這些概念贸呢,請看一個在兩個客戶端之間使用 XMPP 進(jìn)行 IM 通信的簡單示例。
圖 3 演示了兩個實(shí)體之間的簡單會話拢军。注意楞陷,至少有一個服務(wù)器會出現(xiàn)在會話中(在這個例子中,因?yàn)閮蓚€客戶端存在于同一個域中茉唉,所以準(zhǔn)確地說固蛾,只有一個服務(wù)器)。在 圖 3 中度陆,左邊的客戶端是發(fā)起實(shí)體(發(fā)起兩個實(shí)體間的 XMPP 通信)艾凯。XML 流使用 to 屬性來識別接收域(以及定義 XML 名稱空間)。右邊的接收客戶端 接收 XML 流并使用 XML 流響應(yīng)(在這個例子中懂傀,使用 from 屬性)進(jìn)行回應(yīng)趾诗。在這個階段,可以進(jìn)行幾個不同的協(xié)商(如驗(yàn)證和加密)蹬蚁。請忽略這部分討論(例外情況是當(dāng) IM 客戶端出現(xiàn)在不同的域中進(jìn)行服務(wù)器到服務(wù)器通信)恃泪。(請查看 圖 3 的文字版本。)圖 3. 示例(簡化的)XMPP 通信示例(簡化的)XMPP 通信圖圖 3 中的 XML 流的下一步是進(jìn)行消息傳遞犀斋。這個通信在消息節(jié)中進(jìn)行贝乎,并且包括了源和目標(biāo) XMPP 地址(from 和 to)、使用的語言以及節(jié)正文中的消息闪水。對方用其自己的消息進(jìn)行響應(yīng)糕非,關(guān)鍵區(qū)別是源和目標(biāo) XMPP 地址。最后球榆,發(fā)出流關(guān)閉消息(在連接的兩端進(jìn)行)以關(guān)閉 XML 流。任何一邊都可能返回一個錯誤禁筏,如下面所定義持钉。
在本例中,對方發(fā)送了一個無效的 XML 流和節(jié)篱昔。盡管這個示例展示了簡單的 IM 通信每强,但很容易就能了解消息節(jié)是如何轉(zhuǎn)換成 RPC 消息的始腾,同時負(fù)載了來自對等協(xié)商的安全問題。您可以把函數(shù)注冊為節(jié)點(diǎn)空执,以創(chuàng)建一個動態(tài)的 Web 服務(wù)框架浪箭,而不是對域中的用戶進(jìn)行注冊。
文/YZhi(簡書作者)原文鏈接:http://www.reibang.com/p/af87ff15bfe3著作權(quán)歸作者所有辨绊,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)奶栖,并標(biāo)注“簡書作者”。