XMPP(二)XML流-概述

XML流 -概述

XMPP,在本質(zhì)上,是一種XML流技術(shù)。當你準備開始和XMPP服務器會話,你打開一個長時間在線的TCP連接,然后和服務器協(xié)商一個XML流(服務器也同樣也打開一個流,例如在每個方向有一個流)
一旦你和你的服務器建立了一個XML流,你和你的服務器可以通過流交換三個特別的XML片段: < message/>、< presence/>、和< iq/>。這些片段,稱為XML節(jié)(XML stanzas),是XMPP中有意義的基本單元,而且一旦你已建立一個XML流,你可以通過流發(fā)送無限數(shù)量的節(jié)

一個節(jié)可以被認為是通訊的基本單位,類似于一個數(shù)據(jù)包或在其他網(wǎng)絡協(xié)議的消息。
有幾個因素決定了一個節(jié)的意義:

  • 節(jié)元素名稱,有message、presence或iq。每一種節(jié)服務器對它們的路由方式不同,并且客戶端對它們的處理也不同。
  • Type屬性的值依賴于實際中的節(jié)種類而變化。這個值由收件人來進一步區(qū)分每節(jié)是如何處理的。
  • 子元素,定義了節(jié)的有效載荷。有效載荷可能呈現(xiàn)給用戶或按照規(guī)范定義的有效載荷的命名空間以自動的方式處理。

一、消息 (message)

XMPP的< message/>節(jié)是使用基本的”push”方法來從一個地方到另一個地方得到消息。
消息節(jié)有五種不同的類型,通過type屬性來進行區(qū)分:

  • normal

      類型為normal的消息和電子郵件消息最相似,因為它們是單個的消息,對應的回應可能會或也可能不會很快到來。       
    
  • chat

      類型為chat的消息在兩個實體間的實時對話中交換,例如兩個朋友之間的即時通訊聊天。       
    
  • groupchat

      類型為groupchat的消息在多用戶聊天室中交換,和互聯(lián)網(wǎng)中的中繼聊天類似。     
    
  • headline

      類型為headline的消息用于發(fā)送警示和通告,并不期望有回應(收到headline的客戶端不應該讓用戶回復)。      
    
  • error

      如果對于先前發(fā)送郵件發(fā)生錯誤,實體檢測這個問題將返回一個類型為error的消息。  
    

除了type屬性外,消息節(jié)還包括一個to和from地址
from地址不由發(fā)送客戶端提供,而是由發(fā)送者的服務器添加郵戳,以避免地址欺騙。

消息也包含有效載荷元素。核心XMPP規(guī)格定義了一些非?;镜挠行лd荷,例如< body/>和< subject/>,被用于人對人的聊天信息。例如,一個簡單的消息如下:

    <message from="suke@skh.whu.edu.cn"
      to="beta@skh.whu.edu.cn"
      type="chat"> 
    <body>Who are you?</body>
    <subject>Query</subject>
    </message>

注意

  • 屬性的順序無關(guān)緊要(可以按照字母排序來顯示屬性,也可以以任何順序出現(xiàn))。

  • 消息(和其他類的節(jié))可以包含在核心XMPP規(guī)格中沒有定義的有效載荷

二、出席 (presence)

讓別人知道你的狀態(tài) ,以確定可不可以進行聊天,建立連接
只有通過你授權(quán)的人才能看到你是否在線。這個授權(quán)被稱為出席訂閱(presence subscription)。為了讓某人看到你的出席,這個人需要向你發(fā)送訂閱請求,并且你需要批準該請求。一旦你批準了這個訂閱,用戶將自動地接收到關(guān)于你的網(wǎng)絡可用性的常規(guī)通知。
訂閱模型意味著XMPP的<presence/>節(jié)本質(zhì)上是一個簡單、專門的發(fā)布-訂閱方法,通過這種形式,當你在線,然后將狀態(tài)改為“會議中”或者“午餐中”,然后離線,向你訂閱了出席的人將收到更新的出席信息。

例子

<presence from="suke@skh.whu.edu.cn">
<show>xa</show>
<status>down the rabbit hole!</status>
</presence>

三、信息\查詢

信息/查詢(IQ)節(jié)提供了一種用于請求-應答交互和簡單工作流的結(jié)構(gòu),和HTTP中的GET、POST和PUT方法相似
和<message/>節(jié)不同,一個IQ節(jié)能包含僅有一個有效載荷,用于定義處理的請求或接收人采用的行為.
另外,發(fā)送IQ節(jié)的實體必須總是接收一個回復(通常由目的接收者或接受者的服務器產(chǎn)生)

請求和應答通過使用id屬性跟蹤,id屬性由請求實體生成,并被包含在應答的實體中。最后,type屬性在IQ節(jié)中有特定的值:

  • get
    請求實體信息,例如請求注冊一個賬戶(類似于HTTP GET)。
  • set
    請求實體提供一些信息或作出一個請求(類似于HTTP POST或PUT)。
  • result
    應答實體返回get操作的結(jié)果(例如一個實體必須提供信息用來注冊賬戶),或者確認一個set請求(類似于一個HTTP200狀態(tài)碼)。
  • error
    應答實體或一個中間實體,例如XMPP服務器,通知請求實體它不能處理get或set請求(例如,因為請求的格式不正確,請求實體無權(quán)執(zhí)行該操作等)。早期在HTTP中使用的數(shù)字錯誤代碼已被可擴展錯誤條件的XML元素取代。

例子

<iq from="suke@skh.whu.edu.cn"  
id="rr82a1z7"
to="skh.whu.edu.cn" 
type="get">
<query xmlns="jabber:iq:roster"/>
</iq>

服務器返回請求的列表

<iq from="skh.whu.edu.cn" 
id="rr82a1z7"
to="suke@skh.whu.edu.cn"
type="result">
   <query xmlns="jabber:iq:roster">
     <item jid="suke@skh.whu.edu.cn/>
      <item jid="gmz@skh.whu.edu.cn"/>
      <item jid="beta@skh.whu.edu.cn"/>
 </query>
</iq>

注 : < query xmlns="jabber:iq:roster"/>代表命名空間,具體參考上一個文章 XML。

  • IQ-get請求一種特定的信息,例如注冊表、配置數(shù)據(jù)、服務發(fā)現(xiàn)信息或聯(lián)系人列表。
  • IQ-set創(chuàng)建、更新或刪除一種特定的信息,例如已完成的表單、已更新的配置數(shù)據(jù)或者向聯(lián)系人列表添加。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • XMPP簡介 XMPP協(xié)議簡介 XMPP協(xié)議(Extensible Messaging and PresenceP...
    不規(guī)則先生閱讀 6,425評論 2 31
  • 關(guān)于XMPP最權(quán)威的講解:http://www.jabbercn.org/RFC3920(這個才是最權(quán)威的,下面文...
    隨風飄蕩的小逗逼閱讀 1,638評論 1 5
  • 不好意思,內(nèi)附一些swift的東西地址:https://github.com/tanzhiwen/SwiftTip...
    小人不才閱讀 2,337評論 1 7
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 文‖目八刀 來自7-9凌晨 一陣突如其來的暴雨淋濕了床鋪也淋濕了自己。瓢潑大雨,傾灑人間,西風卷簾,峰巒隱...
    目八刀閱讀 320評論 0 0

友情鏈接更多精彩內(nèi)容