基本概念
XMPP(Extensible Messaging and Presence Protocol) 可扩展消息和展示协议,是一种以XML为基础的开放式实时通信协议,它将需要实时通信的消息嵌入到XML结构体当中,不仅具有很好的可扩展性,还拥有较强的可读性。
优点:
- 开放性 公开,有很多已实现的开源库
- 标准性 IM(它只限于文本数据,专注于消息传输,而不是考虑图片传输。即时通讯)标准,遵守该协议的软件之间可以互通
- 可扩展 基于xml
- 跨平台
缺点:
- 数据冗余 使用xml自然会导致冗余,如开始标签必须有结束标签,移动端时候消耗多余流量
- 不支持二进制数据 只限于文本数据,专注于消息传输,而不是考虑图片传输。
基础知识
简单示例:
<stream:stream>
...
<presence>
<show/>
</presence>
<message to='foo'>
<body/>
</message>
<iq to='bar'>
<query/>
</iq>
...
</stream>
身份标识
XMPP规定,每个客户端是使用JID来作为身份标识的:
[user”@”] domain [“/” resource]
domain:用来区分不同平台上的有相同用户名的情况,比如msn和facebook上有相同的用户名
resource:用来区分不同设备上的登陆,比如pc或者移动端
XML Stanza通用属性
Stanza就比如presence,message,iq
- from 表示数据的发送者,但是服务器不会根据这个属性来判断发送者,会根据连接状态做出判断
- to 数据的接受者,没有指定to,服务器认为发给自己
- type 指定Stanza类型,不同的Stanza的type值不太一样
- id 对Stanza 进行唯一标识
stream结构
建立客户机和服务器之间的初始化连接
Client:
<stream:stream
to="gmail.com"
xmlns="jabber:client"
xmlns:stream="http://etherx:jabber.org/streams"
version="1.0">
Server:
<stream:stream
from="gmail.com"
id="id"
xmlns="jabber:client"
xmlns:stream="http://etherx:jabber.org/streams"
version="1.0">
其中id是由服务器生成。
如果客户端和服务器想要断开连接,发送stream的结束标签。
Client:
</stream:stream>
Server:
</stream:stream>
presence结构
标识用户的在线状态
<presence
from="pngfi@gmail.com"
to="haha@foxmail.com"
type="unavailable"/>
这段stanza标识用户pngfi,告诉haha,他已经下线了
其中type的可选值:
- available 标识上线,默认值
- unavailable 下线
- subscribe 订阅某用户的在线状态
- subscribled 授权订阅某用户的在线状态
- unsubscribe 取消订阅某用户的在线状态
- unsubscribed 授权取消订阅某用户的在线状态
当客户端处于在线状态时,可以用show标签标识更加详细的用户状态
<presence>
<show>away</show>
<status>Having a spot of tea</status>
</presence>
show可选参数:
- chat 当前在线,愿意和别人聊天
- away 短时间不在,有一段时间没有操作,系统自动让其进入暂离状态
- xa 长时间离开
- dnd 不想被别人打扰
status表示更加详细的信息
message结构
用于传输聊天的主体内容
<message
from="pngfi@gmail.com"
to="haha@foxmail.com"
type="chat"
<body>Hello!</body>
</message>
body标签存放聊天的主体内容
type可选参数:
- normal 表示一条独立消息,不属于任何一个会话
- chat 表示是一个一对一的会话
- groupchat 表示群聊会话
- headline 用户在客户端上显示的头条,比如轮播图
- error 发生错误
iq结构
表示信息查询,类似于http协议
<iq
from="pngfi@gmail.com"
id="id"
to="pngfi@gmail.com"
type="get">
<query xmlns="jabber:iq:roster"/>
</iq>
以上表示获取自己的联系人列表
其中query标签指定具体的查询动作,jabber:iq:roster
查询联系人列表
type可选参数:
- get 类似于http中的get,指标是获取数据
- set 类似于http中的post,用于设置数据
- result 用于响应查询
- error 发生错误
比如服务器响应上面示例的请求:
<iq
from="pngfi@gmail.com"
id="id"
to="pngfi@gmail.com"
type="result">
<query xmlns="jabber:iq:roster">
<item jid="haha@foxmail.com"/>
<item jid="heihei@163.com"/>
</query>
</iq>
其中item表示pngfi有两个联系人
客户端get时候的id和服务器result时候的id必须保持一致