• XMPP节之message,presence,IQ介绍


    XMPP节

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

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

    <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的属性并非由客户端提供,而是服务端进行的标记。

    presence节

    presence提供网络实体的可访问性。用户发出presence节,表明自己上线,这样可以会有更大的概率与别人通信(人们更愿意与在线的人交流),但是我们也不用担心任何人都可以看到自己的在线状态,除非我们订阅了该用户的状态,订阅之后,用户的状态信息会自动发送到订阅者处。

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

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

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

    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 扩展 协议混合使用节来实现它们的功能。节用于类似于配置和状态变化这样的 信息,而节则用于常规通信。在某些场合中,节也用于通信,这是因为节确认机 制可实现限速功能。

  • 相关阅读:
    A. k-rounding
    哗啦啦村的刁难(4)
    喵哈哈村的种花魔法
    喵哈哈村的赛马比赛
    喵哈哈村的括号序列
    喵哈哈村的排队
    python中递归调用
    python-中函数的参数
    shell中参数及带色彩打印
    python-文件读写
  • 原文地址:https://www.cnblogs.com/alighie/p/9540717.html
Copyright © 2020-2023  润新知