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

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

XMPP客戶端

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

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

至於對客戶端爲什麼要求如此簡單,歸納來講就是,xmpp把相關更多功能實現都放在了服務器端去實現和處理,這樣使得客戶端相對解放出來。。這使得客戶端編寫變得很是容易,更新系統功能也一樣變得容易。服務器

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

  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開源服務器通常被設計成模塊化,由各個不一樣的代碼包(模塊/組件)構成,這些代碼包包括但不限於如下:dom

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

另外,服務器能夠經過附加服務來進行擴展,如完整的安全策略,容許服務器組件的鏈接或客戶端選擇,通向其餘消息系統的網關。ide

基本的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="abc@jabber.org/contact" to="def@jabber.org/contact">
    <status>online</status>
</presence>

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

<message from="abc@jabber.org/contact" to="def@jabber.org/contact" type=「chat」> 
    <body>hello</body>
</message>

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

<iq from="abc@jabber.org/contact"id=「id11」 type=「result」>
</iq>

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

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

相關文章
相關標籤/搜索