XMPP節之message,presence,IQ介紹

XMPP節

核心XMPP工具集由三個基本節組成,分別爲 數據庫

XMPP流由兩份XML文檔組成,通訊的每一個方向均有一個文檔,這些文檔有一個根元素 的子元素由可路由的節以及與流相關的頂級子元素構成。 服務器

<stream:stream>
         <iq type=’get’>
             <query xmlns=’jabber:iq:roster’ />  //請求本身的花名冊
         </iq>
         <presence/>  //通知服務器她已在線並能夠訪問
         <message to=’darcy@pemberley.lit’ from=’elizabaeth@longbourn.lit/ballroom’ type=’chat’>
             <body>
                   I cannot talk of books in a ball-room; my head is always full of something else.
             </body> //發送消息
         </message>
         <presence type=’unavailable’> // 聲明本身不可訪問並關閉
</stream:stream>

通用屬性

from/to/type/id網絡

from的屬性並不是由客戶端提供,而是服務端進行的標記。session

presence節

presence提供網絡實體的可訪問性。用戶發出presence節,代表本身上線,這樣能夠會有更大的機率與別人通訊(人們更願意與在線的人交流),可是咱們也不用擔憂任何人均可以看到本身的在線狀態,除非咱們訂閱了該用戶的狀態,訂閱以後,用戶的狀態信息會自動發送到訂閱者處。工具

實際上,XMPP的presence節是一個簡單的專用的發佈-訂閱方法。code

在IM中,presence體如今花名冊(roster)中,花名冊保存有JID列表以及用戶與這些JID的訂閱關係,一旦上線,用戶發送presence節,剩下的就由服務器處理了(通知本身在線,以及獲取聯繫人的狀態信息)orm

當有客戶端的狀態更新時都會給服務器發送presence消息,從而觸發PresenceUpdateHandler中的process方法,此方法首先判斷presence包中的type,分爲如下幾種方案:xml

  1. type爲空
    說明是第一次發送狀態消息,
    首先,服務器調用broadcastUpdate方法廣播該消息給全部的好友。
    而後,是初始化session的過程,initSession方法中首先檢測該用戶全部好友的在線狀態,而後發送給該用戶。
    以後,從數據庫中提取用戶的離線消息,發送給用戶。
    最後,將type設置爲available 。
  2. type爲unavailable
    說明用戶下線,發送廣播通知全部好友該用戶下線。以後會把該session的狀態設置爲available,並調用SessionManager中的方法通知該id的其餘resource此狀態

message節

用於從一個實體向另一個實體發送消息,並能夠傳輸任何類型的結構化信息,不保證傳輸可靠性路由

message是一個很是基礎的推模型,message一般用於IM,groupchat,警告和通知等。文檔

message的type有以下幾種:

  • normal

    相似於email,發出後不等待迴應

  • chat

    用於兩個實體間的實時通訊

  • groupchat

    多用戶聊天室中使用

  • headline

    用於發送警告或通知

  • error

發送錯誤信息

結構以下:

<message from=madhatter@wonderland.lit/foo to=alice@wonderland.lit type="chat">
  <body>Who are you?</body>
  <subject>Query</subject>
</message>

除了type以外,典型的message節中還包含from、to或者id屬性(用於目的追蹤)。

to中的JID爲消息的接受者,from是發送者的JID,可是from屬性並不是由客戶端提供,而是發送者的服務端提供的,以免地址模仿。

message節中也能夠包含未在XMPP協議中定義的負載,能夠用於擴展。

IQ節

節表示的是Info/Query(信息與查詢),它爲XMPP通訊提供請求與響應機制。它與HTTP 協議的基本工做原理很是類似,容許獲取和設置查詢,與HTTP 的GET 和POST 動做相似。 每一個 節都必須有一個響應,並且前面曾經提到過,該節的必需的id 屬性將用來把響應 與致使該響應的請求關聯起來。 節有四種,經過該節的type 屬性區分。有兩種 節請求 (get 和set)和兩種響應(result 和error)。在本書中,這些節一般被縮寫爲IQ-get、IQ-set、IQ-result 和IQ-error。 每個IQ-get 或IQ-set 節均必須接收響應的IQ-result 或IQ-error 節。下面的示例給出了一 些常見的 節以及它們可能的響應。注意,與 節(它們定義了子元素) 不一樣, 節一般只包含與它們功能相關的擴展元素。此外,每一對 節必須匹配id 屬性。

<iq from='jane@longbourn.lit/garden'  
    type='get'  
    id='roster1'>  
    <query xmlns='jabber:iq:roster'/>  
</iq>
<iq to='jane@longbourn.lit/garden'  
    type='error'  
    id='roster1'>  
    <query xmlns='jabber:iq:roster'/>  
    <error type='cancel'>  
        <feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>  
    </error>  
</iq>

Jane 向她的服務器發送了一個格式錯誤的花名冊請求。服務器使用一個錯誤提示節做爲響應

<iq from='jane@longbourn.lit/garden'  
    type='get'  
    id='roster2'>  
    <query xmlns='jabber:iq:roster'/>  
</iq>
<iq to='jane@longbourn.lit/garden'  
    type='result'  
    id='roster2'>  
    <query xmlns='jabber:iq:roster'>  
        <item jid='elizabeth@longbourn.lit' name='Elizabeth'/>  
        <item jid='bingley@netherfield.lit' name='Bingley'/>  
    </query>  
</iq>

在從新發送正確的請求以後,服務器將Jane 的簡短花名冊響應給她。能夠看到Elizabeth 和 Bingley 均在Jane 的聯繫人列表中。

<iq from='jane@longbourn.lit/garden'  
    type='set'  
    id='roster3'>  
    <query xmlns='jabber:iq:roster'>  
        <item jid='darcy@pemberley.lit' name='Mr. Darcy'/>  
    </query>  
</iq>
<iq to='jane@longbourn.lit/garden'  
    type='result'  
    id='roster3'/>

Jane 試圖將Darcy 添加到本身的花名冊中,服務器用一個空白IQ-result 節來指出添加成功。 若是應答節只是成功確認,那麼IQ-result 節一般是空白的。 在任何須要結果數據或者須要簡單確認的場合中, 節都很是有用。大多數XMPP 擴展 協議混合使用 節來實現它們的功能。 節用於相似於配置和狀態變化這樣的 信息,而 節則用於常規通訊。在某些場合中, 節也用於通訊,這是由於節確認機 制可實現限速功能。

相關文章
相關標籤/搜索