XMPP protocol
XMPP 协议
XMPP 协议是一种基于 XML 的 IM 协议,其前身是 jabber,后来被 IETF 标准化。其他信息可以参考 wikipedia.
协议架构
- 通过 TCP socket 与 XMPP 服务器进行通信
- 传输的是预定格式的 XML 信息
- 通过解析 XML 提取请求类型和消息
消息格式
一个实体在 XMPP 网络中被称为一个节点,它有唯一的标示符 jabber identifier (JID),实体可以是用户或者聊天室
XMPP 中定义了 3 个顶层元素:
Message
、Presence
、IQ
Message
基本的消息通讯格式:- To:消息的接收方
- from : 发送方的 JID
- body: 要发送的消息
- type:
- normal:单纯的消息,不要求响应;
- chat:IM 消息
- groupchat:聊天室 group chat
- headline:发送 alert 和 notification 消息
- error:发送 message 出错时通知
<message from='[email protected]/test' to='[email protected]' type='chat'> <body>Anybody?</body> </message>
Presence
用来表明用户的状态,如:online、away、dnd (请勿打扰)等。
当用户离线或改变自己的状态时,就会在 stream 的上下文中插入一个 Presence 元素,来表明自身的状态。要想接受 presence 消息,必须经过一个叫做 presence subscription 的授权过程。- type: 非必须
- subscribe:订阅其他用户的状态
- probe:请求获取其他用户的状态
- unavailable:不可用,offline
- show: 用户当前状态
- chat:聊天中
- away:暂离
- xa:eXtend Away,长时间离开
- dnd:请勿打扰
- status:自由文本,即 rich presence 或 extended presence
<presence from='[email protected]/test' xml:lang='en'> <show>dnd</show> <status>Busy!</status> </presence>
- type: 非必须
IQ (Info/Query)
请求/响应消息,如获取用户的好友列表。- type:
- get: 获取一个值
- set: 设置或替换 get 查询的值
- result: 服务器响应了先前的查询,返回结果如好友列表
- error: 请求或响应出现错误
<iq from='[email protected]/test' id='xxxxxx' to='test' type='subscribe'> <ping xmlns='urn:xmpp:ping'/> </iq> <iq from='test' id='xxxxxx' to='[email protected]/test' type='error'> <error type='modify'> <bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>
- type:
Ref:
[1] http://xmpp.org/rfcs/rfc6120.html
[2] http://en.wikipedia.org/wiki/XMPP