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)系人列表添加。