本文是根據xmpp協議視頻教程的學習筆記。服務器
每個客戶端使用JID(jabber identifier)來做爲身份標識 ,格式爲[user"@"]domain["/"resource],其中dom
domain:服務器域名; user:用戶名; resource:屬於用戶的位置或設備,好比是手機仍是電腦
一個用戶能夠同時以多種資源與統一個XMPP服務器鏈接,完整的JID例子:zhangsan@gmail.com/iphone6s
stanza的通用屬性:from,to,type,id(from屬性與to屬性遵循JID的格式)
from:標識消息的發送方,可是考慮到會出現僞造客戶端消息來源,服務器通常不會直接採用from的數據來確認數據是由誰發的,而是更具鏈接狀態作校驗。
to:指定消息的所要發送的對象,若是沒有給出to屬性,則服務器認爲該消息是發送給本身的,而不會轉發給其餘的用戶。
type:指定一段stanza的類型
id:stanza的惟一性標識,當客戶端向服務端發送消息後,服務端向客戶端作出響應,此處的id用於表示服務端是不是針對以前給此服務端發送消息的客戶端的作惟一性標識。客服端在給服務端發消息的時候會在消息中加上該id。服務端在向客戶端回覆消息的時候回在消息中加上一樣的id。
stream標籤
client經過向server發送下面一段stanza來請求創建鏈接(注意沒有結束標籤)iphone
<stream:stream to="example.com" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0" >
當服務端收到客服端發來的消息後,經過回覆下面一段stanza來創建鏈接(沒有結束標籤)ide
<stream:stream from="example.com" to="clientId" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0" >
上面的id有服務器端隨機生成,在以後將其做爲客戶端與服務端鏈接的惟一id,當經歷這次交互以後,客戶端與服務端就成功創建鏈接,纔會認爲客戶端與服務端都是支持xmpp協議,才能進行進一步的數據通訊。注意,客戶端與服務端之間沒有發送的stanza只有開始標籤而沒有結束標籤,其含義是表示一直處於鏈接狀態,若是要想斷開鏈接,只須要向對方發送結束標籤</stream:stream>便可。post
presence 標籤用於標識當前的用戶在線狀態,基本結構以下學習
<presence from="zhangsan@gmail.com" to="lisi@hotmail.com" type="unavailable" />
上面這段xml標籤的意思是zhangsan@gmail.com告訴lisi@hotmail.com他已經下線了,presence種的type的可選參數available(在線)、unavailable(離線)、spa
subscribe(可訂閱)、subscribed(已受權訂閱)、unsubscribe(取消訂閱)、unsubscribed(已受權取消訂閱)、error(發送錯誤)。當客戶端在線是,能夠經過一些擴展標籤豐富該在線狀態,例如:code
<presence> <show>away</show> <status>外出就餐</status> </presence
show標籤標示更加詳細的在線狀態,標示暫時離開,status則是最進一步說明。orm
show標籤有如下可選參數:chat(在線且願意和與別人聊天)、 away(短期不在)、 xa(長時間離開)、 dnd(請勿打擾)。視頻
message標籤用於傳輸具體內容,格式以下:
<message from="zhangan@gmail.com" to="lisi@hotmail.com" type="chat" > <body>週末一塊兒去大保健吼不吼啊!</body> </message>
其中message中type屬性的可選參數有:normal(獨立消息。不屬於任何一個會話)、chat(表示一對一的會話,兩我的之間的會話)、groupchat(羣聊,至關於QQ裏的羣或者討論組的概念)、headline(頭條)、error(出現錯誤)
iq(Information Query)標籤結構以下:
<iq from="zhangsan@gmail.com" id="idididi" to="zhangsan@gmail.com" type="get"> <query xmlns="jabber:iq:roster"/> </iq>
其中from與to指定同一個JID.query標籤中的roster是指聯繫人列表的意思。type可選的值有:get(獲取數據,相似於http協議中的get請求)、set(設置數據,相似於http協議中的post請求)、result(用於相應數據)、error(發生錯誤)
上面的一段iq的stanza表示用戶zhangsan@gmail.com向服務器發起了查詢本身的聯繫人的請求其響應的結果可能以下:
<iq from="zhangsan@gmail.com" id="idididi" to="zhangsan@gmail.com" type="result"> <query xmlns="jabber:iq:roster"> <item jid="zhangsan@gmail.com"/> <item jid="lisi@hotmail.com"/> <item jid="wangwu@foxmail.com"/> <item jid="haha@163.com"/> </query> </iq>
注意iq標中的id在發送get請求和返回result時必須保持一致。iq標籤不單單用於查詢請求,還能夠用戶註冊、登陸、通知等
完整的stanza以下
<!--一個完整的 xml stanza --> <stream:stream><!--stream 用於創建初始化鏈接 --> <presence><!--presence 標籤用於標識當前的用戶狀態 --> <show/> </presence> <message to=」foo」> <body/> </message> <iq to="bar"> <query /> </iq> ... </stream:stream>