閱讀911 返回首頁    go 支付寶


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

  上一篇:go 軟件工程學習之初
  下一篇:go HTTP協議詳解