911
支付寶
Asmack開發係列之通信數據流
上一節,我們介紹了XMPP的基礎,還沒說完,說到了通信洪流,然後就結束了。這一節,我們接著講。主要是“stanzas”(節).上一節,我們說,區分stanzas,需要從它的名字,屬性TYPE和子節點來區分。這一節,我們分別介紹:消息(Message),出席/上線(Presence),信息查詢(IQ)以及可擴展性(Extensibility)。
1,消息(Message)
消息<message/>是xmpp中的一種典型的“推”(Push)方法,它不需要回複,屬於一種閱後即焚的的機製。適用於IM,Groupchat,alert和Notification。根據它的type屬性可以分為:
1)常規(normal)
常規的消息特別像郵件消息,因為你給別人發的消息,別人可以回,也可以不回。
2)對話(chat)
對話消息是兩個實體之間的實時對話,例如你和你的qq好友在聊天。
3)群組對話(GroupChat)
使用在多人的對話房間裏麵。
4)頭條(Headline)
頭條用來發送警告和通告,這種消息不需要回複。
5)錯誤(Error)
這種消息一般來說是對某一條消息的回複,告訴對方什麼出錯了。
Message出了Type這個屬性,還有其他屬性:
1)to 要去哪裏,就是跟你對話的那個是誰(JID);
2)from,從來裏來。其實你發消息給別人,from就是你,但是,這個from字段貌似不是由你來填充,而是由你的服務器來填充,為什麼要這麼做呢?其實,如果讓你填充,你明明是張三,你填個李四過去,那豈不是欺騙(Spoofing)麼。對不對。
3)id。標示這個消息是獨一無二的。在調試的時候特別有用
然後,Message也可以有負載,也就是子節點。例如<body/>和<subject/>,用在一對一的對話中。
給大家一個示例:
<message from="madhatter@wonderland.lit/foo" to="alice@wonderland.lit" type="chat"> <body>Who are you?</body> <subject>Query</subject> </message>
2,出席(Presence)
這是實時通信和其他應用不同的特性之一。出席完成什麼一件事情呢?其實就是,你的QQ好友上線了,然後你的QQ列表就會把它頭像點亮。這個過程就是,首先你訂閱了人家的這種出席消息,也就是一般來說人家是你好友,默認是訂閱的,當然他可以拒絕你的訂閱(在線對其隱身)。所以Presence是一種“Publish-subscribe”發布-訂閱的模式。
一個Presence的消息示例如下:
<presence from="alice@wonderland.lit/pda"> <show>xa</show> <status>down the rabbit hole!</status> </presence>
3,信息查詢(IQ)
信息查詢Info/Query(IQ)提供一種請求-響應(Request-Response)的機製,有點像HTTP裏麵的GET,POST,PUT方法。和<message/>不一樣,IQ包隻能夠有一個負載,即隻能夠有一個子節點。而且IQ包一個請求它是必須得到響應的,這個響應可能來自對方,或者對方的服務器(這點好理解,因為當對方不可達的時候)。IQ包的Id非常重要,你請求過去的IQ包,包含一個id,而它回複的時候這個id依然是作為包的id,這樣來表示對你該次請求的回應。
IQ包的type屬性包含:
1)get (請求)。這種請求是向對方請求信息,類似於HTTP GET。
2)set(設置)。這個類似於HTTP POST 或者PUT。
3)result(結果)。get請求的結果,或者是set的回複(類似於HTTP 200狀態碼)。
4)error(錯誤)。當對方無法滿足你的需求的時候,它會返回一個錯誤給你,或者它的服務器返回一個錯誤給你。
一個查詢花名冊的IQ包:
<iq from="alice@wonderland.lit/pda" to="alice@wonderland.lit" type="get"> <query xmlns="jabber:iq:roster"/> </iq>回複:
<iq from="alice@wonderland.lit" to="alice@wonderland.lit/pda" type="result"> <query xmlns="jabber:iq:roster"> <item j/> <item j/> <item j/> <item j/> </query> </iq>
添加一個成員到花名冊:
<iq from="alice@wonderland.lit/pda" to="alice@wonderland.lit" type="set"> <query xmlns="jabber:iq:roster"> <item j/> </query> </iq>
回複:
<iq from="alice@wonderland.lit" to="alice@wonderland.lit/pda" type="result"/>
它和服務器的交互過程入下圖所示:

4,可擴展性
因為是基於XML的,所以可擴展性非常好,具體就這裏不講了。
5,源碼解析
後續我會放出這部分的源碼解析,盡請期待,同事約打CS了。88.
最後更新:2017-04-03 05:40:17