[轉]XMPP基本概念--節(stanza)

本文介紹在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>標籤表明了一個聯繫人信息。

相關文章
相關標籤/搜索