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" 
id="rr82a1z7"
to="alice@wonderland.lit" 
type="get">
<query xmlns="jabber:iq:roster"/>
</iq>
回复:
<iq from="alice@wonderland.lit" 
id="rr82a1z7"
to="alice@wonderland.lit/pda" 
type="result">
<query xmlns="jabber:iq:roster">
<item jid="whiterabbit@wonderland.lit"/>
<item jid="lory@wonderland.lit"/>
<item jid="mouse@wonderland.lit"/>
<item jid="sister@realworld.lit"/>
</query>
</iq>

添加一个成员到花名册:
<iq from="alice@wonderland.lit/pda"
id="ru761vd7"
to="alice@wonderland.lit" 
type="set">
<query xmlns="jabber:iq:roster">
<item jid="madhatter@wonderland.lit"/>
</query>
</iq>

回复:
<iq from="alice@wonderland.lit" 
id="ru761vd7"
to="alice@wonderland.lit/pda" 
type="result"/>

它和服务器的交互过程入下图所示:
Asmack开发系列之通信数据流
4,可扩展性
因为是基于XML的,所以可扩展性非常好,具体就这里不讲了。

5,源码解析
后续我会放出这部分的源码解析,尽请期待,同事约打CS了。88.












上一篇:云速搭 - ECS结合网络相关优化方案


下一篇:Shell在大数据时代的魅力:从一道百度大数据面试题想到的点滴