本文介紹在XMPP通訊中最核心的三個XML節(stanza).這些節(stanza)有本身的做用和目標,經過組織不一樣的節(stanza),就能達到咱們各類各樣的通訊目的。 服務器
首先咱們來看一段XMPP流。
<stream:stream>
<iq type='get'><query xmlns='jabber:iq:roster'/></iq>
<presence/>
<message to='william_duan@jabber.org' from='test_account@jabber.org' type='chat'><body>Hello</body></message>
<presence type='unavailable'/>
</stream:stream>
在上面的例子中,咱們能夠看到一些XMPP節(stanza),包括<iq>,<message>以及<presence>。接下來就對這些節(stanza)作一個大體的瞭解。
節的共通屬性ide
1.1 fromorm
表示節(stanza)的發送方,在發送節(stanza)時,通常來講不推薦設定,服務器會自動設定正確的值,若是你設定了不正確的值,服務器將會拒收你的節(stanza)信息。xml
若是在客戶端到服務器端的通訊中接收的節(stanza)中沒有本屬性,會被默認解釋爲信息是由服務器發出的。ip
若是在服務器到服務器的通訊中接收的節(stanza)中沒有本屬性,則會被解釋爲一個error.get
1.2 toit
表示節(stanza)的接收方。io
若是在客戶端到服務器端的通訊中沒有設置本屬性,服務器會默認解釋爲信息是發給本身的。thread
1.3 typetest
指定節(stanza)的類型.每種節(stanza)都會有幾種可能的設定值。
全部的節(stanza)都會有一個error類型,,代表這個節(stanza)是一個error迴應,對這樣的節(stanza)信息不須要進行迴應。
1.4 id
表示一個特定的請求。在<iq>節中,這個屬性是必需要指定的,可是在其餘兩個節(stanza)中是一個可選屬性。
<presence>
presence節(stanza)用來控制和表示實體的在線狀態,能夠展現從離線到在線甚至於離開,不能打擾等複雜狀態,另外,還能被用來創建和結束在線狀態的訂閱。
下面是一些節(stanza)的例子:
<presence/>
設定用戶狀態爲在線
<presence type="unavailable"/>
設定用戶狀態爲離線
<presence>
<show>away</show>
<status>at the ball</status>
</presence>
用於顯示用戶狀態的詳細信息。上面的例子代表用戶由於at the ball在離開狀態。
<show>標籤在presence節點中最多出現一次,能夠有如下取值:away,chat,dnd,xa.
away:離線
char:交談中
dnd:但願不被打擾
xa:離開一段時間
<status>標籤用於顯示額外信息
<presence>
<status>touring the countryside</status>
<priority>10</priority>
</presence>
在這個節中,出現了一個<priority>標籤,表示如今鏈接的優先級。 每一個鏈接能夠設置從-128到127的優先級,默認是設置爲0。用戶能夠在這個標籤裏修改相應的優先級。若是有相應的設置的話,用戶送往純JID的將會送到優先級最高的那個鏈接,若是設置值爲負數的話,則表示送往純JID的消息將永遠不會送達該鏈接。
擴展<presence>節點
1.在線狀態預約(presence subscription)
首先咱們來看一個例子:
<presence
from="william_duan@jabber.org"
to="test_account@jabber.org"
type="subscribe"/>
<presence
from="test_account@jabber.org"
to="william_duan@jabber.org"
type="subscribed"/>
經過上述交互,william_duan就能看到test_account的在線狀態,並能接收到test_account的在線狀態通知了。
<message> 正如名字同樣,message節(stanza)用於用戶之間傳遞消息。這消息能夠是單純的聊天信息,也能夠某種格式化的信息。 message節點信息是傳遞以後就被忘記的。當消息被送出以後,發送者是無論這個消息是 否已經送出或者何時被接收到。經過擴展協議,能夠改變這樣一種情況。
下面咱們看一些例子:
<message
from="william_duan@jabber.org"
to="test_account@jabber.org"
type="chat">
<body>Come on</body>
<thread>23sdfewtr234weasdf</thread>
</message>
私人聊天信息
<message
from="test_account@jabber.org"
to="william_duan@jabber.org"
type="groupchat">
<body>welcome</body>
</message>
多人聊天信息
上面的兩個例子都包含了一個<type>標籤,這個標籤代表了消息的類型,能夠取下面的一些值. chat:私人聊天信息,在IM中是最多見的。
error:錯誤信息
normal:不怎麼使用的類型
groupchat:多人聊天信息
headline:一般用在自動服務中,不須要回應。
<body>標籤裏面是具體的消息內容。
<iq> iq節(stanza)主要是用於Info/Query模式的消息請求,他和Http協議比較類似。能夠發出get以及set請求,就如同http中的GET以及POST. iq節點須要有迴應,有get,set兩種請求以及result,error兩種迴應。
下面咱們看看一些例子:
<iq
from="william_duan@jabber.org/study"
type="get"
id="roster1">
<query xmlns="jabber:iq:roster"/>
</iq>
william_duan請求本身的聯繫人列表。
<iq
to="william_duan@jabber.org/study"
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>
請求發生錯誤。
<iq
to="william_duan@jabber.org/study"
type="result"
id="roster1">
<query xmlns="jabber:iq:roster"/>
<item jid="account_one@jabber.org" name="one"/>
<item jid="account_two@jabber.org" name="two"/></iq> 請求成功,返回william_duan的聯繫人列表。每個<item>標籤表明了一個聯繫人信息。