上一节,我们介绍了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"/>
它和服务器的交互过程入下图所示:
4,可扩展性
因为是基于XML的,所以可扩展性非常好,具体就这里不讲了。
5,源码解析
后续我会放出这部分的源码解析,尽请期待,同事约打CS了。88.