且听疯吟 如此生活三十年
XMPP protocol

XMPP 协议

XMPP 协议是一种基于 XML 的 IM 协议,其前身是 jabber,后来被 IETF 标准化。其他信息可以参考 wikipedia.

协议架构

  • 通过 TCP socket 与 XMPP 服务器进行通信
  • 传输的是预定格式的 XML 信息
  • 通过解析 XML 提取请求类型和消息

消息格式

  • 一个实体在 XMPP 网络中被称为一个节点,它有唯一的标示符 jabber identifier (JID),实体可以是用户或者聊天室

  • XMPP 中定义了 3 个顶层元素: MessagePresenceIQ

    • 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>
      
    • 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>
      

Ref:
[1] http://xmpp.org/rfcs/rfc6120.html
[2] http://en.wikipedia.org/wiki/XMPP