XMPP协议简单学习

基本概念

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必须保持一致

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值