XMPP——xmpp客戶端、服務器、網關以及地址和消息格式詳解

接着上一篇文章繼續學習和總結。。

XMPP客戶端

XMPP 系統的一個設計標準是必須支持簡單的客戶端。事實上,XMPP 系統架構對客戶端只有很少的幾個限制。一個XMPP 客戶端必須支持的功能有:

  1. 通過 TCP 套接字與XMPP 服務器進行通信;
  2. 解析組織好的 XML 信息包;
  3. 理解消息數據類型。

至於對客戶端爲何要求如此簡單,概括來說就是,xmpp把相關更多功能實現都放在了服務器端去實現和處理,這樣使得客戶端相對解放出來。。這使得客戶端編寫變得非常容易,更新系統功能也同樣變得容易。

XMPP 客戶端與服務端通過XML 在TCP 套接字的5222 端口進行通信,而不需要客戶端之間直接進行通信。
基本的XMPP 客戶端必須實現以下標準協議(XEP-0211):

  1. RFC3920 核心協議Core
  2. RFC3921 即時消息和出席協議Instant Messaging and Presence
  3. XEP-0030 服務發現Service Discovery
  4. XEP-0115 實體能力Entity Capabilities

XMPP服務器

XMPP 服務器遵循兩個主要法則:

  1. 監聽客戶端連接,並直接與客戶端應用程序通信;
  2. 與其他 XMPP 服務器通信;

不要小看它只需遵循的原則少,這兩個原則是所有xmpp服務器的核心與根本,不然,基於xmpp的im根本無從談起,更別說基於此的模塊化擴展了…

XMPP開源服務器一般被設計成模塊化,由各個不同的代碼包(模塊/組件)構成,這些代碼包包括但不限於以下:

  1. Session管理
  2. 用戶和服務器之間的通信
  3. 服務器之間的通信
  4. DNS(Domain Name System)轉換
  5. 存儲用戶的個人信息和朋友名單
  6. 保留用戶在下線時收到的信息
  7. 用戶註冊
  8. 用戶的身份和權限認證
  9. 根據用戶的要求過濾信息
  10. 系統記錄

另外,服務器可以通過附加服務來進行擴展,如完整的安全策略,允許服務器組件的連接或客戶端選擇,通向其他消息系統的網關。

基本的XMPP 服務器必須實現以下標準協議

  1. RFC3920 核心協議Core
  2. RFC3921 即時消息和出席協議Instant Messaging and Presence
  3. XEP-0030 服務發現Service Discovery

XMPP網關

XMPP 突出的特點是可以和其他即時通信系統交換信息和用戶在線狀況。由於協議不同,XMPP 和其他系統交換信息必須通過協議的轉換來實現,目前幾種主流即時通信協議都沒有公開,所以XMPP 服務器本身並沒有實現和其他協議的轉換,但它的架構允許轉換的實現。實現這個特殊功能的服務端在XMPP 架構裏叫做網關(gateway)。目前,XMPP 實現了和AIM、ICQ、IRC、MSN Massager、RSS0.9 和Yahoo Massager 的協議轉換。由於網關的存在,XMPP 架構事實上兼容所有其他即時通信網絡,這無疑大大提高了XMPP 的靈活性和可擴展性。

從這個角度來講,xmpp網關就是xmpp向外暴露了一個可以兼容其他主流通訊協議的一個接口(某種意義上來說)基於此,我們可以自己實現相應的通信協議來實現xmpp與本協議的相互轉換和通信,類似於一個充電器的轉換接口,可以適配不同類型的手機一樣。

XMPP地址格式

一個實體在XMPP網絡結構中被稱爲一個接點,它有唯一的標示符jabber identifier(JID),即實體地址,用來表示一個Jabber用戶,但是也可以表示其他內容,例如一個聊天室.

一個有效的JID包括一系列元素:

  1. 域名(domain identifier);
  2. 節點(node identifier);
  3. 源(resource identifier).

它的格式是node@domain/resourcenode@domain,類似電子郵件的地址格式.domain用來表示接點不同的設備或位置,這個是可選的,例如a在Server1上註冊了一個用戶,用戶名爲doom,那麼a的JID就是doom@serverl,在發送消息時,指明doom@serverl就可以了,resource可以不用指定(是可選的),但a在登錄到這個Server時,a的JID可能是doom@serverl/exodus(如果a用Exodus軟件登錄),也可能是doom@serverl/psi(如果a用psi軟件登錄).資源只用來識別屬於用戶的位置或設備等,一個用戶可以同時以多種資源與同一個XMPP服務器連接。

XMPP消息格式

XMPP中定義了3個頂層XML元素: Message、Presence、IQ

Message
用於在兩個jabber用戶之間發送信息。Jsm(jabber會話管理器)負責滿足所有的消息,不管目標用戶的狀態如何。如果用戶在線jsm立即提交;否則jsm就存儲。

To :標識消息的接收方。
from : 指發送方的名字或標示(id)o
Text: 此元素包含了要提交給目標用戶的信息

栗子:

<message to= ‘lily@jabber.org/contacttype =’chat’>
    <body> 你好,在忙嗎</body>
</message>

Presence
用來表明用戶的狀態,如:online、away、dnd(請勿打擾)等。當用戶離線或改變自己的狀態時,就會在stream的上下文中插入一個Presence元素,來表明自身的狀態.結構如下所示:

<presence>
    From =‘lily @ jabber.com/contact’
    To = ‘yaoman @ jabber.com/contact'
    <status> Online </status>
</presence>

presence 元素可以取下面幾種值:
Probe :用於向接受消息方發送特殊的請求
subscribe:當接受方狀態改變時,自動向發送方發送presence信息。

IQ
一種請求/響應機制,從一個實體從發送請求,另外一個實體接受請求,並進行響應.例如,client在stream的上下文中插入一個元素,向Server請求得到自己的好友列表,Server返回一個裏面是請求的結果.

iq 主要的屬性是type。包括:

  1. Get :獲取當前域值。
  2. Set :設置或替換get查詢的值。
  3. Result :說明成功的響應了先前的查詢。
  4. Error: 查詢和響應中出現的錯誤。

結構如下所示:

<iq from =‘lily @ jabber.com/contactid=’1364564666’ Type=’result’>

再一個例子:
Presence
用於確定用戶的狀態。消息結構舉例如下(每個 XML 的 node 還會有很多其他 attribute,爲了簡單起見這裏省略,下同):

<presence from="[email protected]/contact" to="[email protected]/contact">
    <status>online</status>
</presence>

Message
用於在兩個用戶之間發送消息。消息結構舉例如下:

<message from="[email protected]/contact" to="[email protected]/contact" type=“chat”> 
    <body>hello</body>
</message>

IQ
信息/請求,是一個請求-響應機制,管理XMPP服務器上兩個用戶的轉換,允許他們通過相應的XML格式進行查詢和響應。

<iq from="[email protected]/contact"id=“id11” type=“result”>
</iq>

下一篇文章再繼續學習和總結我這段時間閱讀xmpp協議核心文檔 RFC3920 核心協議Core 的過程中遇到的問題和自己的理解。

jessonlv——呂國棟原創文章,轉載請註明出處:http://blog.csdn.net/jessonlv

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章