上一篇博客我们简单的介绍了一下xmpp的基本概念、基本网络结构以及基本的工作原理。我们知道xmpp是用TCP传输xml数据流的协议,那么其xml数据的基本结构是怎么样的呢?
这就是我们这一篇博客需要讨论的问题。旨在为读者构建一个大致的思维框架,具体的深入学习还是要开读者自己来完成。
Xml是有节点构成的,而基于xml的xmpp协议中与通信有关三个最核心的节(stanza):<message>、<presence>、<iq>,通过组织不同的节来达到各式各样不同的通讯目的。
每个节都有其属性,虽然不同的节,其属性各有不同,但是一些基本的属性是这些所有的节所共同的,我们先来介绍一些这些共同属性。
1、 from
节的发送方,不推荐自行设定。之所以不推荐自己设定是因为一般服务器会自动设定这个属性,而且自行设定容易出错,若from属性出错,服务器会拒绝节信息。
2、 to
顾名思义,节的接收方,这个节点一般是自己设置的,若到达服务器的数据中没收设置该属性,则服务器会认为这条信息是发送给自己的。
3、 type
这个节与前两个不同,设置的值不可以统一而论,不同的节有不同的设定值。比如,在<presence>中可以设置为用户的在线或离线状态,<message>可以设置成表示消息类型的值(私聊、群聊等)。
虽然不同节点的type属性各有不同,但是都有一个error类型,表示这是一条错误信息,服务器接收到这种类型的信息的时候不需要作出任何的回应。
4、 id
用于标志唯一的一条特定信息。<iq>必须有这个属性,<message>、<presence>可选。、、
介绍完这些节的共同属性,接下来我们说一下每个节代表什么吧!
<message>:用于在用户之间传递信息,可以是单纯的聊天信息,也可以是某种格式化的信息,<message>节点传递后就会被忘记,但这并不是一成不变的,可以通过扩展协议改变这一状态。
<presence>:用来表示实体(可以理解为用户在程序中的抽象实体吧)的在线状态。还可以简历和结束在线状态订阅(特别关心?上线提醒?)。这个节有优先级,默认为零。
<iq>:主要用于Info/Query模式(请求响应)的请求,和http比较类似。可以发出get或者set请求。<iq>节点需要有回应。其type属性可以有四种设定值:
get:获取当前域值
set:设置或者替换get查询的值
result:说明成功响应了之前的查询(类似于http状态码中的200)
error:错误
以下是一些xmpp片段,帮助大家理解:
<stream:stream>
<iq type='get'><queryxmlns='jabber:iq:roster'/></iq>
<presence/>
<message to='william_duan@jabber.org'from='test_account@jabber.org'type='chat'><body>Hello</body></message>
<presence type='unavailable'/>
</stream:stream>
以上是根据网上的讲解加上自己理解完成的,旨在帮助读者形成一个相对清晰的思路。如遇类似,纯属偶然。括号内的部分内容为笔者脑洞,不一定准确。