2019独角兽企业重金招聘Python工程师标准>>>

本文介绍在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="error" 
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>标签代表了一个联系人信息。

转载于:https://my.oschina.net/u/1263964/blog/179909

XMPP基本概念--节(stanza)相关推荐

  1. xmpp协议详解一:xmpp基本概念

    概述 XMPP是一个开放式的XML协议,设计用于准实时消息和出席信息以及请求-响应服务. 通用的架构 通常采用客户端服务器架构进行实现,其中客户端通过TCP方式使用XMPP访问服务器,服务器之间也采用 ...

  2. 基于XMPP的即时通信系统的建立(一)— XMPP基础概念

    相关背景 IM(Instant Messaging)正在被广泛使用,特别是公司与它们的客户互动连接方案以及互联网与Web2.0相关的应用.为了解决即时通信的标准问题,IETF(互联网工程任务组 The ...

  3. RFC3920 xmpp协议

    RFC3920 "原文来自RFC 3920"可扩展的消息和出席信息协议 (XMPP): 核心协议 关于本文的说明 本文为互联网社区定义了一个互联网标准跟踪协议,并且申请讨论协议和提 ...

  4. xmpp协议(即时通信协议规范)

    转载自 https://www.cnblogs.com/jiyuqi/p/5085932.html 相关背景 IM(Instant Messaging)正在被广泛使用,特别是公司与它们的客户互动连接方 ...

  5. Openfire XMPP Smack RTC IM 即时通讯 聊天 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. 即时通讯学习笔记002---xmpp基本概念

    JAVA技术交流QQ群:170933152 概述 XMPP是一个开放式的XML协议,设计用于准实时消息和出席信息以及请求-响应服务. 通用的架构 通常采用客户端服务器架构进行实现,其中客户端通过TCP ...

  7. 基于XMPP的即时通信系统的建立(二)— XMPP详解

    XMPP详解 XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议.在此基础上,XMPP ...

  8. webrtc详细教程

    cdsn博客不支持word文件,所以这里显示不完全.可到本人资源中下载word文档: v0.3:http://download.csdn.net/detail/kl222/6961491 v0.1:h ...

  9. html如何设置打印分页打印出来,网页中如何用 CSS 设置打印分页符

    Word 中按 Ctrl + Enter 创建一个分页符,方便打印,其实网页中也可以,用 CSS 的 page-break-after:always;. 第 1 页 第 2 页 第 3 页 任何浏览器 ...

最新文章

  1. python 连续输出日期_我想生成连续的日期
  2. python小游戏开发,使用python实现英语打字游戏
  3. 安装php时,make步骤报错make: *** [ext/gd/gd.lo] Error 1
  4. MFC和QT等UI框架的特点
  5. 首期openGauss训练营结营,48个FAQ和全部PPT通通给你,随附62人结营学员名单
  6. python自动获取邮件数据_Python 获取测试报告内容并发送邮件
  7. jsoncpp的安装与使用实战(windows交叉编译Ubuntu)
  8. java 第几周_java获取第几周
  9. java详细设计模式有代码
  10. paypal如何支付欧元_paypal海外支付流程是什么?paypal中国可以用吗?
  11. 正交设计 python算法_正交设计 - SegmentFault 思否
  12. select *和select 字段名
  13. Xcode自动编译、打包、上传到蒲公英应用分发平台
  14. 【蓝桥杯选拔赛真题15】Scratch碰苹果游戏 少儿编程scratch蓝桥杯选拔赛真题讲解
  15. 什么是Resnet50模型?
  16. .NetCore——Autofac使用
  17. (九) 基于cadence 617 电流镜仿真对比 笔记记录
  18. 空间超分辨率(SISR)领域非常不错的blog/论文(长期更新)
  19. 群体智能:新一代AI的重要方向
  20. 处理R安装后出现You're using a non-UTF8 locale, therefore only ASCII characters will work.的情况

热门文章

  1. 还在用Postman?来,花2分钟体验下ApiPost的魅力!
  2. 性能测试之JMeter配置元件【HTTP信息头管理器】
  3. pillow支持python 2和python 3_python3读取图像并可视化的方法(PIL/Pillow、opencv/cv2)...
  4. php 交换,php变量交换
  5. 怎样写出没有bug的代码?
  6. 什么是HTML5前端开发?HTML5前端要学哪些技术?
  7. 有的歌声音大有的歌声音小_手机听筒声音小怎么办?别急,只需一把刷子
  8. oracle 审计用户登录信息,Oracle预警用户登录锁定、过期及其审计信息
  9. qt程序使用多行linux命令,开发Qt应用程序的基本方法总结
  10. nginx 发送动态内容注意事项