zoukankan      html  css  js  c++  java
  • [转]XMPP基本概念--节(stanza)

    本文介绍在XMPP通信中最核心的三个XML节(stanza).这些节(stanza)有自己的作用和目标,通过组织不同的节(stanza),就能达到我们各种各样的通信目的。 


    首先我们来看一段XMPP流。 
    <stream:stream> 
    <iq type='get'><query xmlns='jabber:iq:roster'/></iq> 
    <presence/> 
    <message to='william_duan@jabber.org' from='test_account@jabber.org' type='chat'><body>Hello</body></message> 
    <presence type='unavailable'/> 
    </stream:stream> 

    在上面的例子中,我们可以看到一些XMPP节(stanza),包括<iq>,<message>以及<presence>。接下来就对这些节(stanza)做一个大致的了解。 

    节的共通属性

    1.1 from

    表示节(stanza)的发送方,在发送节(stanza)时,一般来说不推荐设定,服务器会自动设定正确的值,如果你设定了不正确的值,服务器将会拒收你的节(stanza)信息。

    如果在客户端到服务器端的通信中接收的节(stanza)中没有本属性,会被默认解释为信息是由服务器发出的。

    如果在服务器到服务器的通信中接收的节(stanza)中没有本属性,则会被解释为一个error.

    1.2 to

    表示节(stanza)的接收方。

    如果在客户端到服务器端的通信中没有设置本属性,服务器会默认解释为信息是发给自己的。

    1.3 type

    指定节(stanza)的类型.每种节(stanza)都会有几种可能的设定值。

    所有的节(stanza)都会有一个error类型,,表明这个节(stanza)是一个error回应,对这样的节(stanza)信息不需要进行回应。

    1.4 id

    表示一个特定的请求。在<iq>节中,这个属性是必须要指定的,但是在其他两个节(stanza)中是一个可选属性。 

    <presence>
    presence节(stanza)用来控制和表示实体的在线状态,可以展示从离线到在线甚至于离开,不能打扰等复杂状态,另外,还能被用来建立和结束在线状态的订阅。 


    下面是一些节(stanza)的例子: 
    <presence/>
    设定用户状态为在线 


    <presence type="unavailable"/> 
    设定用户状态为离线 


    <presence>
    <show>away</show>
    <status>at the ball</status>
    </presence> 
    用于显示用户状态的详细信息。上面的例子表明用户因为at the ball在离开状态。
    <show>标签在presence节点中最多出现一次,可以有以下取值:away,chat,dnd,xa. 
    away:离线 
    char:交谈中 
    dnd:希望不被打扰 
    xa:离开一段时间 
    <status>标签用于显示额外信息 


    <presence>
    <status>touring the countryside</status>
    <priority>10</priority>
    </presence> 
    在这个节中,出现了一个<priority>标签,表示现在连接的优先级。 每个连接可以设置从-128到127的优先级,默认是设置为0。用户可以在这个标签里修改相应的优先级。如果有相应的设置的话,用户送往纯JID的将会送到优先级最高的那个连接,如果设置值为负数的话,则表示送往纯JID的消息将永远不会送达该连接。

    扩展<presence>节点
    1.在线状态预定(presence subscription) 
    首先我们来看一个例子: 
    <presence 
    from="william_duan@jabber.org
    to="test_account@jabber.org
    type="subscribe"/>
    <presence 
    from="test_account@jabber.org
    to="william_duan@jabber.org
    type="subscribed"/>
    通过上述交互,william_duan就能看到test_account的在线状态,并能接收到test_account的在线状态通知了。

    <message> 正如名字一样,message节(stanza)用于用户之间传递消息。这消息可以是单纯的聊天信息,也可以某种格式化的信息。 message节点信息是传递之后就被忘记的。当消息被送出之后,发送者是不管这个消息是 否已经送出或者什么时候被接收到。通过扩展协议,可以改变这样一种状况。 
    下面我们看一些例子: 
    <message 
    from="william_duan@jabber.org
    to="test_account@jabber.org
    type="chat">
    <body>Come on</body>
    <thread>23sdfewtr234weasdf</thread>
    </message> 
    私人聊天信息 


    <message 
    from="test_account@jabber.org
    to="william_duan@jabber.org
    type="groupchat">
    <body>welcome</body>
    </message>
    多人聊天信息 


    上面的两个例子都包含了一个<type>标签,这个标签表明了消息的类型,可以取下面的一些值. chat:私人聊天信息,在IM中是最常见的。 
    error:错误信息 
    normal:不怎么使用的类型 
    groupchat:多人聊天信息 
    headline:通常用在自动服务中,不需要回应。 
    <body>标签里面是具体的消息内容。

    <iq> iq节(stanza)主要是用于Info/Query模式的消息请求,他和Http协议比较相似。可以发出get以及set请求,就如同http中的GET以及POST. iq节点需要有回应,有get,set两种请求以及result,error两种回应。 
    下面我们看看一些例子: 
    <iq 
    from="william_duan@jabber.org/study
    type="get" 
    id="roster1">
    <query xmlns="jabber:iq:roster"/>
    </iq> 
    william_duan请求自己的联系人列表。 


    <iq 
    to="william_duan@jabber.org/study
    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> 
    请求发生错误。 


    <iq 
    to="william_duan@jabber.org/study
    type="result" 
    id="roster1">
    <query xmlns="jabber:iq:roster"/>
    <item jid="account_one@jabber.org" name="one"/>
    <item jid="account_two@jabber.org" name="two"/>
    </iq> 
    请求成功,返回william_duan的联系人列表。每一个<item>标签代表了一个联系人信息。

  • 相关阅读:
    C程序课题设计——基于图形界面开发的学生信息管理系统
    Linux系统的介绍(以下以Manjaro最新版为例子)
    linux环境下PS1变量配置
    C指针课题实验报告——职工工资管理系统
    vim系统配置文件,配置专属自己的环境
    git常用操作命令
    vim设置成类source insight功能,实现跳转和查找
    ext2文件系统学习札记
    【转载】解析Linux中的VFS文件系统机制
    linux中链表_队列等的基本原理以及操作以及堆栈
  • 原文地址:https://www.cnblogs.com/unqiang/p/4371323.html
Copyright © 2011-2022 走看看