[转]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>标签代表了一个联系人信息。
[转]XMPP基本概念--节(stanza)的更多相关文章
- 基于XMPP的即时通信系统的建立(一)— XMPP基础概念
相关背景 IM(Instant Messaging)正在被广泛使用,特别是公司与它们的客户互动连接方案以及互联网与Web2.0相关的应用.为了解决即时通信的标准问题,IETF(互联网工程任务组 The ...
- XMPP 和 OpenFire
XMPP XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测.是一种数据传输协议. XMPP的前身是Jabber,一个开源形式组织产生的网络 ...
- Openfire XMPP Smack RTC IM 即时通讯 聊天 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 基于XMPP的即时通信系统的建立(二)— XMPP详解
XMPP详解 XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议.在此基础上,XMPP ...
- 基于XMPP的即时通信系统的建立 — XMPP IQ详解
XMPP详解 XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议.在此基础上,XMPP ...
- XMPP即时通讯协议使用(前传)——协议详解
XMPP详解 XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议.在此基础上,XMPP ...
- webrtc教程
cdsn博客不支持word文件,所以这里显示不完全.可到本人资源中下载word文档: v0.3:http://download.csdn.net/detail/kl222/6961491 v0.1:h ...
- RFC3920
RFC3920 可扩展的消息和出席信息协议 (XMPP): 核心协议 关于本文的说明 本文为互联网社区定义了一个互联网标准跟踪协议,并且申请讨论协议和提出了改进的建议.请参照"互联网官方协议 ...
- XEP-0198:流管理
------------恢复内容开始------------ 原文来自:https://xmpp.org/extensions/xep-0198.html,只翻译了技术方面的内容. 摘要:这个规范定义 ...
随机推荐
- Codeforces 920E Connected Components? 补图连通块个数
题目链接 题意 对给定的一张图,求其补图的联通块个数及大小. 思路 参考 ww140142. 维护一个链表,里面存放未归入到任何一个连通块中的点,即有必要从其开始进行拓展的点. 对于每个这样的点,从它 ...
- linux 通过MD5监控指定路径文件的变动
脚本须知: 1. 运行此脚本的用户必须是root,因为在某些文件所在路径普通用户没有访问权限 2. 源文件和其md5码只要有一方内容有改动,都会导致校验失败,所以校验码的保存就至关重要防止其他人修改, ...
- 解决Spring在线程中注入为空指针的问题
在启用线程中使用来jdbcTemplate来查询数据库,引入jdbcTemplate是用Spring @Autowired注解 方式引入,但是在运行中 jdbcTemplate 总是 空指针 解决 ...
- java使用dbutils工具类实现小程序 管家婆记账软件
1.所需创建的包和 jar包 2.创建表结构 #生成一些表数据 ,,'交通银行','2016-03-02','家庭聚餐'); ,,'现金','2016-03-15','开工资了'); ,,'现金', ...
- Centos python 2.6 升级到 2.7
前几天做了下阿里云的RDS日志相关功能,其工具大都是Python语言编写,但服务器初始化时的Python版本又不满足需求,本身也没有学过Python,因此在问题定位上费了一番周折,最后找朋友帮忙看了下 ...
- 牛客网 牛客小白月赛1 H.写真がとどいています
H.写真がとどいています 链接:https://www.nowcoder.com/acm/contest/85/H来源:牛客网 这个题数乱了,导致wa了好几次. 特别弱智,从A开始往上,就 ...
- Codeforces Gym101522 C.Cheering-字符串 (La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017)
C.Cheering To boost contestants' performances in the 20th La Salle - Pui Ching Programming Challenge ...
- Auto-Test 要点纪录(一)
1,select下拉框类型 使用工具可以看到html对应标签为<select>这类标签才是真正的下拉框类型就需要对应的方法,不能但看页面上的效果,有的做成了效果但其实不是select类型即 ...
- node.js中的exports和module.exports
不同的编程语言都有各自的代码组织和复用的方式,如.net.php中的命名空间,python中的import,ruby中的module等,来避免命名空间污染.一直都没搞清楚node中的exports和m ...
- supervisor启动sqlmapapi失败 sqlmapapi: ERROR (file is not executable)
问题:在使用supervisor管理sqlmapapi的时候,启动的时候报错: sqlmapapi: ERROR (file is not executable) 解决办法:sudo supervis ...