XMPP节之message,presence,IQ介绍

XMPP节

核心XMPP工具集由三个基本节组成,分别为 数据库

XMPP流由两份XML文档组成,通讯的每一个方向均有一个文档,这些文档有一个根元素 的子元素由可路由的节以及与流相关的顶级子元素构成。 服务器

<stream:stream>
         <iq type=’get’>
             <query xmlns=’jabber:iq:roster’ />  //请求本身的花名册
         </iq>
         <presence/>  //通知服务器她已在线并能够访问
         <message to=’darcy@pemberley.lit’ from=’elizabaeth@longbourn.lit/ballroom’ type=’chat’>
             <body>
                   I cannot talk of books in a ball-room; my head is always full of something else.
             </body> //发送消息
         </message>
         <presence type=’unavailable’> // 声明本身不可访问并关闭
</stream:stream>

通用属性

from/to/type/id网络

from的属性并不是由客户端提供,而是服务端进行的标记。session

presence节

presence提供网络实体的可访问性。用户发出presence节,代表本身上线,这样能够会有更大的几率与别人通讯(人们更愿意与在线的人交流),可是咱们也不用担忧任何人均可以看到本身的在线状态,除非咱们订阅了该用户的状态,订阅以后,用户的状态信息会自动发送到订阅者处。工具

实际上,XMPP的presence节是一个简单的专用的发布-订阅方法。code

在IM中,presence体如今花名册(roster)中,花名册保存有JID列表以及用户与这些JID的订阅关系,一旦上线,用户发送presence节,剩下的就由服务器处理了(通知本身在线,以及获取联系人的状态信息)orm

当有客户端的状态更新时都会给服务器发送presence消息,从而触发PresenceUpdateHandler中的process方法,此方法首先判断presence包中的type,分为如下几种方案:xml

  1. type为空
    说明是第一次发送状态消息,
    首先,服务器调用broadcastUpdate方法广播该消息给全部的好友。
    而后,是初始化session的过程,initSession方法中首先检测该用户全部好友的在线状态,而后发送给该用户。
    以后,从数据库中提取用户的离线消息,发送给用户。
    最后,将type设置为available 。
  2. type为unavailable
    说明用户下线,发送广播通知全部好友该用户下线。以后会把该session的状态设置为available,并调用SessionManager中的方法通知该id的其余resource此状态

message节

用于从一个实体向另一个实体发送消息,并能够传输任何类型的结构化信息,不保证传输可靠性路由

message是一个很是基础的推模型,message一般用于IM,groupchat,警告和通知等。文档

message的type有以下几种:

  • normal

    相似于email,发出后不等待回应

  • chat

    用于两个实体间的实时通讯

  • groupchat

    多用户聊天室中使用

  • headline

    用于发送警告或通知

  • error

发送错误信息

结构以下:

<message from=madhatter@wonderland.lit/foo to=alice@wonderland.lit type="chat">
  <body>Who are you?</body>
  <subject>Query</subject>
</message>

除了type以外,典型的message节中还包含from、to或者id属性(用于目的追踪)。

to中的JID为消息的接受者,from是发送者的JID,可是from属性并不是由客户端提供,而是发送者的服务端提供的,以免地址模仿。

message节中也能够包含未在XMPP协议中定义的负载,能够用于扩展。

IQ节

节表示的是Info/Query(信息与查询),它为XMPP通讯提供请求与响应机制。它与HTTP 协议的基本工做原理很是类似,容许获取和设置查询,与HTTP 的GET 和POST 动做相似。 每一个 节都必须有一个响应,并且前面曾经提到过,该节的必需的id 属性将用来把响应 与致使该响应的请求关联起来。 节有四种,经过该节的type 属性区分。有两种 节请求 (get 和set)和两种响应(result 和error)。在本书中,这些节一般被缩写为IQ-get、IQ-set、IQ-result 和IQ-error。 每个IQ-get 或IQ-set 节均必须接收响应的IQ-result 或IQ-error 节。下面的示例给出了一 些常见的 节以及它们可能的响应。注意,与 节(它们定义了子元素) 不一样, 节一般只包含与它们功能相关的扩展元素。此外,每一对 节必须匹配id 属性。

<iq from='jane@longbourn.lit/garden'  
    type='get'  
    id='roster1'>  
    <query xmlns='jabber:iq:roster'/>  
</iq>
<iq to='jane@longbourn.lit/garden'  
    type='error'  
    id='roster1'>  
    <query xmlns='jabber:iq:roster'/>  
    <error type='cancel'>  
        <feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>  
    </error>  
</iq>

Jane 向她的服务器发送了一个格式错误的花名册请求。服务器使用一个错误提示节做为响应

<iq from='jane@longbourn.lit/garden'  
    type='get'  
    id='roster2'>  
    <query xmlns='jabber:iq:roster'/>  
</iq>
<iq to='jane@longbourn.lit/garden'  
    type='result'  
    id='roster2'>  
    <query xmlns='jabber:iq:roster'>  
        <item jid='elizabeth@longbourn.lit' name='Elizabeth'/>  
        <item jid='bingley@netherfield.lit' name='Bingley'/>  
    </query>  
</iq>

在从新发送正确的请求以后,服务器将Jane 的简短花名册响应给她。能够看到Elizabeth 和 Bingley 均在Jane 的联系人列表中。

<iq from='jane@longbourn.lit/garden'  
    type='set'  
    id='roster3'>  
    <query xmlns='jabber:iq:roster'>  
        <item jid='darcy@pemberley.lit' name='Mr. Darcy'/>  
    </query>  
</iq>
<iq to='jane@longbourn.lit/garden'  
    type='result'  
    id='roster3'/>

Jane 试图将Darcy 添加到本身的花名册中,服务器用一个空白IQ-result 节来指出添加成功。 若是应答节只是成功确认,那么IQ-result 节一般是空白的。 在任何须要结果数据或者须要简单确认的场合中, 节都很是有用。大多数XMPP 扩展 协议混合使用 节来实现它们的功能。 节用于相似于配置和状态变化这样的 信息,而 节则用于常规通讯。在某些场合中, 节也用于通讯,这是由于节确认机 制可实现限速功能。

相关文章
相关标签/搜索