XML流
一个简单的 XMPP 会话, 包括流和节之间的交互, 也包括被客户端(以“C” 开头) 发送出去的节和服务器(以“S” 开头) 传递进来的节
C: <stream:stream>
C: <presence/>
C: <iq type="get">
<query
xmlns="jabber:iq:roster"/>
</iq>
S: <iq type="result">
<query
xmlns="jabber:iq:roster">
<item jid="suke@skh.whu.edu.cn/>
<item jid="gmz@skh.whu.edu.cn"/>
<item jid="beta@skh.whu.edu.cn"/>
</query>
</iq>
C: <message from="suke@skh.whu.edu.cn"
to="beta@skh.whu.edu.cn">
<body>Off with hishead!</body>
</message>
S: <message from="lj@skh.whu.edu.cn"
to="cyl@skh.whu.edu.cn ">
<body>You are all pardoned.</body>
</message>
C: <presence type="unavailable"/>
C: </stream:stream>
通讯
- 节元素名称, 有message、 presence 或 iq。 每一种节服务器对它们的路由方式不同,
并且客户端对它们的处理也不同。 - Type 属性的值依赖于实际中的节种类而变化。 这个值由收件人来进一步区分每节
是如何处理的。 - 子元素, 定义了节的有效载荷。 有效载荷可能呈现给用户或按照规范定义的有效载
荷的命名空间以自动的方式处理。
消息<message/>
<message/>节是使用基本的”push”方法来从一个地方到另一个地方得到消息。
因为消息通常是不告知的, 它们是一种”fire-and-forget”的机制来从一个地方到另一个地方快速获取信息。 消息被用于 IM、 groupchat、 alerts 和 notifications, 以及其他应用。
type属性
消息节有五种不同的类型, 通过 type 属性来进行区分:
- normal
类型为 normal的消息和电子邮件消息最相似, 因为它们是单个的消息, 对应的回应可能会或也可能不会很快到来。 - chat
类型为 chat 的消息在两个实体间的实时对话中交换, 例如两个朋友之间的即时通讯聊天。 - groupchat
类型为 groupchat 的消息在多用户聊天室中交换, 和互联网中的中继聊天类似 - headline
类型为 headline 的消息用于发送警示和通告, 并不期望有回应(收到 headline 的客端不应该让用户回复) 。 - error
如果对于先前发送邮件发生错误, 实体检测这个问题将返回一个类型为 error 的消息。
from地址
from 地址不由发送客户端提供, 而是由发送者的服务器添加邮戳, 以避免地址欺骗。
to地址
to地址是预期接收人的JabberID, from 地址是发送者的 JabberID
id属性
用于跟踪目的
有效载荷
XMPP 规格定义了一些非常基本的有效载荷, 例如
<message from="suke@skh.whu.edu.cn"
to="beta@skh.whu.edu.cn"
type="chat">
<body>Who are you?</body>
<subject>Query</subject>
</message>
属性的顺序无关紧要(通常按照字母排序来显示属性, 但可以以任何顺序出现)
出席<presence/>
出席通知其他实体的网络可用性, 并且使你能够知道其他实体是否在线和可用于通讯。
订阅模型意味着 XMPP 的<presence/>节本质上是一个简单、 专门的发布-订阅方法, 通过这种形式, 当你在线, 然后将状态改为“会议中” 或者“午餐中” , 然后离线, 向你订阅了出席的人将收到更新的出席信息
信息/查询<iq/>
信息/查询(IQ) 节提供了一种用于请求-应答交互和简单工作流的结构, 和你熟悉的 HTTP中的 GET、 POST 和 PUT 方法相似。 和<message/>节不同, 一个IQ节能包含仅有一个有效载荷, 用于定义处理的请求或接收人采用的行为。 另外, 发送IQ节的实体必须总是接收一个回复(通常由目的接收者或接受者的服务器产生) 。 请求和应答通过使用id属性跟踪,id属性由请求实体生成,并被包含在应答的实体中。
type属性
- get
请求实体信息,例如请求注册一个账户(类似于 HTTP GET) 。 - set
请求实体提供一些信息或作出一个请求(类似于 HTTP POST 或 PUT) 。 - result
应答实体返回 get 操作的结果(例如一个实体必须提供信息用来注册账户) , 或者确认一个 set 请求(类似于一个 HTTP200 状态码) 。 - error
应答实体或一个中间实体, 例如 XMPP 服务器, 通知请求实体它不能处理 get 或 set请求(例如, 因为请求的格式不正确, 请求实体无权执行该操作等) 。 早期在 HTTP 中使用的数字错误代码已被可扩展错误条件的 XML 元素取代。
message消息一般用于可读文本、警告、通知,不需要确定消息是否被真的传出去(可靠性要求低)
iq消息有回复,用于可靠传输
IQ-get 请求一种特定的信息, 例如注册表、配置数据、服务发现信息或联系人列表。IQ-set 创建、更新或删除一种特定的信息,例如已完成的表单、已更新的配置数据或者向联系人列表添加。
扩展性
一个 XML 节可以包含无数个其他子元素, 包括 XHTML 格式的消息体、 URL 链接、 RSS或 Atom 通告、 需要填的表单、 XML-RPC 或用于网络服务的 SOAP 数据、 地理位置和其他范围的有效载荷。
扩展匹配元素名称和命名空间。 在 Jabber 开源项目早期, 开发者使用<x/>元素表示扩展, 包括被放置在消息或出席节和<query/>元素的扩展, 被放置在 IQ 节 的扩展
错误处理
XMPP并不确认发送出去的每个包或消息,没有收的到错误消息就表示那么消息或出席节就已经成功传递出去了。
- IQ节:总是收到一个IQ-result或者IQ-error作为多IQ-set或IQ-get的应答
错误的报告是通过节的 type 属性值为 error 设置的
<message from="suke@skh.whu.edu.cn"
to="gmz@skh.whu.edu.cn"
type="error">
<error type="cancel">
<service-unavailable xmlns="urn:ietf:params:xml:ns:XMPP-stanzas"/>
</error>
</message>
<error/>元素的 type 属性值是auth、 cancel、 continue、 modify 或 wait 之一。
出席
发出订阅请求
<presence from="suke@skh.whu.edu.cn" to="beta@skh.whu.edu.cn" type="subscribe"/>
接受订阅请求
<presence from="beta@skh.whu.edu.cn" to=" suke@skh.whu.edu.cn" type="subscribed"/>
订阅是单向的,双方需要互相发送订阅请求
出席的传播
- xml流信息
- 发送初始化出席节到服务器
<presence/> - 服务器检查名册,通知已订阅的每一个人
<presence from="suke@skh.whu.edu.cn" to="beta@skh.whu.edu.cn"/>
<presence from="suke@skh.whu.edu.cn" to="gmz@skh.whu.edu.cn"/> - 服务器发送出席调查,为了判断对方状态
<presence from="suke@skh.whu.edu.cn" to="beta@skh.whu.edu.cn" type=“probe”/>
<presence from="suke@skh.whu.edu.cn" to="gmz@skh.whu.edu.cn" type=“probe”/> - 收到对方出席通知,得到对方状态
<presence from="gmz@skh.whu.edu.cn" to="suke@skh.whu.edu.cn" type="unavailable">
<delay xmlns="urn:XMPP:delay" stamp="2008-11-26T15:59:09Z"/>
</presence>
<presence from="lj@skh.whu.edu.cn" to="suke@skh.whu.edu.cn"/>
<presence from="skh@skh.whu.edu.cn" to="suke@skh.whu.edu.cn"/>
可用性状态
<show/>元素和<status/>元素
<presence>
<show>away</show>
<status>Having a spot of tea</status>
</presence>
出席优先级
出席节可以包括一个可选元素:<priority/>
每个连接的资源可以标识一个优先级, 范围从-127 到128。 高优先级的资源更容易接受到发送给简化 ID 的消息。 有负值的资源永远不会收到这样一个消息(虽然它会接受直接发送给它的信息)
<presence from="suke@skh.whu.edu.cn/office">
<priority>7</priority>
</presence>
<presence from="suke@skh.whu.edu.cn/TV">
<priority>-1</priority>
</presence>
定向出席
和一个人临时通话,但不加入联络列表
<message from="suke@skh.whu.edu.cn" to="whiterabbit@skh.whu.edu.cn" type="chat">
<body>If youplease, sir--</body>
</message>
<presence from="suke@skh.whu.edu.cn" to="whiterabbit@skh.whu.edu.cn"/>
<presence from="whiterabbit@skh.whu.edu.cn/mobile" to="suke@skh.whu.edu.cn" type="unavailable"/>
下线
<presence type=“unavailable”/>
下线有这样几种含义:
- 你的服务器向你的联络列表中的所有人广播你不可用的通知。
- 你的服务器同样向所有你发送了定向出席的实体广播你的不可用状态的通知。
- 如果你没有其他的在线资源, 当你的联系人的服务器接收到一个不可用通知时, 它们应该会停止向你发送出席通知。
如果你没有其他的在线资源, 你的服务器将停止发送信息给你, 将它们储存起来, 下次
你上线时, 将这些信息传递给你。
XMPP协议的命名空间
jabber:iq:private -- 私有数据存储,用于本地用户私人设置信息,比如用户备注等。
jabber:iq:conference -- 一般会议,用于多个用户之间的信息共享
jabber:x:encrypted -- 加密的消息,用于发送加密消息
jabber:x:expire -- 消息终止
jabber:iq:time -- 客户端时间
jabber:iq:auth -- 简单用户认证,一般用于服务器之间或者服务器和客户端之间的认证
jabber:x:roster -- 内部花名册
jabber:x:signed -- 标记的在线状态
jabber:iq:search -- 用户数据库查询,用于向服务器发送查询请求
jabber:iq:register -- 注册请求,用于用户注册相关信息
jabber:x:iq:roster -- 花名册管理
jabber:x:conference -- 会议邀请,用于向参加会议用户发送开会通知
jabber:x:event -- 消息事件
vcard-temp -- 临时的vCard,用于设置用户的头像以及昵称等