核心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節,代表本身上線,這樣能夠會有更大的機率與別人通訊(人們更願意與在線的人交流),可是咱們也不用擔憂任何人均可以看到本身的在線狀態,除非咱們訂閱了該用戶的狀態,訂閱以後,用戶的狀態信息會自動發送到訂閱者處。工具
實際上,XMPP的presence節是一個簡單的專用的發佈-訂閱方法。code
在IM中,presence體如今花名冊(roster)中,花名冊保存有JID列表以及用戶與這些JID的訂閱關係,一旦上線,用戶發送presence節,剩下的就由服務器處理了(通知本身在線,以及獲取聯繫人的狀態信息)orm
當有客戶端的狀態更新時都會給服務器發送presence消息,從而觸發PresenceUpdateHandler中的process方法,此方法首先判斷presence包中的type,分爲如下幾種方案:xml
用於從一個實體向另一個實體發送消息,並能夠傳輸任何類型的結構化信息,不保證傳輸可靠性路由
message是一個很是基礎的推模型,message一般用於IM,groupchat,警告和通知等。文檔
message的type有以下幾種:
相似於email,發出後不等待迴應
用於兩個實體間的實時通訊
多用戶聊天室中使用
用於發送警告或通知
發送錯誤信息
結構以下:
<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 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 節一般是空白的。 在任何須要結果數據或者須要簡單確認的場合中,