这几天公司软件要增加黑名单的功能,因为公司产品的IM功能模块用的是开源的Gloox库,Gloox是实现了XMPP协议的c++客户端库,所以我觉得这个功能应该是很简单的,结果做起来发现XMPP的花名册管理(XMPP协议里面花名册管理部分相当于一般IM的好友管理)还挺麻烦的,消息绕来绕去的,我头都转晕了,再加上公司的前辈也没留下文档,没办法只有好好看看XMPP协议文档对花名册管理部分的描述了。

XMPP协议文档编号是RFC2193,里面的第7部分就是花名册管理(RostorManage)的描述,由于是英文文档,所以我看的速度很慢,然后边看边写了个Demo来印证,当然了Demo也是基于Gloox库的,服务端用的Openfire Server。花了一天的功夫终于有了个初步的了解,为了加深理解,也方便自己以后查阅,我决定把英文文档中关于RostorManage的部分翻译过来,然后加上一些自己的理解,下面就进入正题了。

在XMPP里面,一个人的联系人列表被称作一张花名册,其中包含一定数量联系人的名片,每张名片由JID唯一标识(JID通常是contact@domain的格式)。每个用户的花名册都被用户服务端存储在该用户的专属空间,所以该用户下的任意资源都可以访问花名册信息。

语法和语义

花名册通过包含一个<query/>子节点元素的IQ节点来管理花名册,并且这个子节点名为’jabber:iq:roster’域,这个<query/元素可以包含一个或者多个<item/>子元素,每个<item/>用来描述一个唯一的名片或者是联系人,每个<item/>包含一个JID作为关键字。在<item/>中可能会包含一个’subscription’属性,用来描述当前JID用户对于<item/>中的JID联系人用户出席订阅的状态,这个状态属性包含以下的值:

"none" -- 用户没有对联系人出席信息的一个订阅,同时联系人也没有对用户出席信息的订阅。

"to" --  用户有对联系人出席信息的一个订阅,但是联系人也没有对用户出席信息的订阅。

"from" -- 联系人有对用户出席信息的订阅,但是用户没有对联系人出席信息的订阅。

"both" -- 用户和联系人都要对彼此出席信息的订阅。

每个<item/>可以包含一个或者多个<group/>子节点,这些是用户用来将联系人分入不同的类别,比如我们可以将QQ好友分为同学类别、亲人类别或者是普通好友类别。每个<group/>节点之间都是分离的。

PS:最近发现网上早就有一个关于Jabber/XMPP协议的中文翻译计划的项目可扩展的消息和出席信息协议 (XMPP): 即时消息和出席信息,这个里面对整个RFC3921用完整的翻译,所以在此我也没有必要完全将整个RostorManage部分完全翻译出来,我就主要将自己的一些理解概括出来。

下面介绍一下RostorManage的关键点:

1)添加一个花名册子项

一个用户在任何时刻都可以添加一个子项到他(她)的花名册里面,如下,客户端添加一个新的花名册子项:

<iq from=’juliet@example.com/balcony’ type=’set’ id=’roster_2’>
<query xmlns=’jabber:iq:roster’>
<item jid=’nurse@example.com’
name=’Nurse’>
<group>Servants</group>
</item>
</query>
</iq>

服务端收到客户端发的添加信息后,必须用户的花名册信息,并永久保存,同时还要花名册的改变发送给当前用户下的所有要求传送花名册的资源,同时会要求客户端返回收到改变信息的回复消息。这个发送改变命令的格式如下:

<iq to=’juliet@example.com/balcony’
type=’set’
id=’a78b4q6ha463’>
<query xmlns=’jabber:iq:roster’>
<item jid=’nurse@example.com’
name=’Nurse’
subscription=’none’>
<group>Servants</group>
</item>
</query>
</iq>
<iq to=’juliet@example.com/chamber’
type=’set’
id=’a78b4q6ha464’>
<query xmlns=’jabber:iq:roster’>
<item jid=’nurse@example.com’
name=’Nurse’
subscription=’none’>
<group>Servants</group>
</item>
</query>
</iq>

服务端要求回复信息格式

<iq to=’juliet@example.com/balcony’ type=’result’ id=’roster_2’/>

上面“juliet@example.com“用户包含了两个资源”balcony“和”chamber“,客户端的用户资源在收到服务端发的信息后需要回复,格式如下:

<iq from=’juliet@example.com/balcony’
to=’example.com’
type=’result’
id=’a78b4q6ha463’/>
<iq from=’juliet@example.com/chamber’
to=’example.com’
type=’result’
id=’a78b4q6ha464’/>

2)更新一个花名册子项

更新的花名册的发送的数据格式和添加一个新的花名册一样,服务端收到更新消息后会永久的更新花名册的信息,同时将要更新的花名册子项发送给所有要请求花名册的用户资源,消息格式(客户端发送的一个更新花名册子项的分组的格式)如下:

<iq from=’juliet@example.com/chamber’ type=’set’ id=’roster_3’>
<query xmlns=’jabber:iq:roster’>
<item jid=’romeo@example.net’
name=’Romeo’
subscription=’both’>
<group>Friends</group>
<group>Lovers</group>
</item>
</query>
</iq>

3)删除一个花名册子项

用户可以再任意时刻从他(她)的花名册删除一个子项,通过发送一个IQ的SET消息给服务端,同时设置IQ节点’subscription’属性的值为”remove“(一个兼容性好的服务器会忽略这个属性的其他值),消息格式如下:

<iq from=’juliet@example.com/balcony’ type=’set’ id=’roster_4’>
<query xmlns=’jabber:iq:roster’>
<item jid=’nurse@example.com’ subscription=’remove’/>
</query>
</iq>

下面的内容是关于名册条目和出席信息订阅的集成,关于这一部分内容比较长,细节也比复杂,所以我决定主要是图表的方式描述,再附带说明,就留着下一节介绍。

花名册管理之基本概念和操作相关推荐

  1. 用pv操作描述如下前驱图_跟我学PMP | PV、AC、EV…挣值管理的基本概念都是啥?...

    和挣值管理相关的有三个比较重要的基本概念. 首先是项目的计划价值,简称为PV(Plan Value). 这是为计划工作分配的经批准的预算.它是为了完成某个活动或WBS的组成部分而准备的一份经过批准的预 ...

  2. SAP权限管理的基本概念

    SAP系统中有着严谨的权限管控,本篇博客将介绍SAP权限管理的基本概念. 1 常用的事务代码: SU01 - User Maintenance (用户信息维护) SU10 - User Mass Ma ...

  3. 网站建设与管理的基本概念

    网站建设与管理的基本概念 第一章:绪论 静态网页与动态网页 静态网页的优势 响应速度快 服务器资源占用少 对于大量的用户访问,生成静态很大的网站都采用的静态页面的技术. 页面和应用程序是分离的 便于搜 ...

  4. Rundeck基础:3:基础概念:操作Project

    Rundeck是一个基于Java和Grails的开源的运维自动化工具,提供了Web管理界面进行操作,同时提供命令行工具和WebAPI的访问控制方式.在这篇文章中,介绍一下基本概念和操作Project的 ...

  5. Linux描述文件权限,Linux ugo 权限基本概念和操作

    Linux 系统中文件的 ugo 权限是 Linux 进行权限管理的基本方式.本文将介绍 ugo 权限的基本概念. 说明:本文的演示环境为 Ubuntu 16.04. 文件的所有者和组 Linux 文 ...

  6. 使用network管理DD恢复全库操作步骤

    使用network管理DD恢复全库操作步骤 基本信息: 系统平台:RHEL 5.4_86_64 database版本:11.2.0.2.0-64bit 1.检查目标主机是否安装networker客户端 ...

  7. linux挂载硬盘_CentOS「linux」学习笔记12:磁盘管理、分区挂载卸载操作

    linux基础操作:主要介绍了磁盘管理.分区挂载卸载操作. 特别说明linux中磁盘表现形式: IDE硬盘在linux中表示方式为"hdx".SCSI硬盘在linux中表示方式为& ...

  8. centos 卸载_CentOS「linux」学习笔记12:磁盘管理、分区挂载卸载操作

    linux基础操作:主要介绍了磁盘管理.分区挂载卸载操作. 特别说明linux中磁盘表现形式: IDE硬盘在linux中表示方式为"hdx".SCSI硬盘在linux中表示方式为& ...

  9. (转)C#网络编程(基本概念和操作) - Part.1

    源码下载:http://www.tracefact.net/SourceCode/Network-Part1-2.rar C#网络编程(基本概念和操作) - Part.1 引言 C#网络编程系列文章计 ...

最新文章

  1. 下载煎蛋妹子图python代码[自用]
  2. Python使用os.listdir()函数来得目录内容的介绍
  3. [原创]换一份工作要考虑什么?
  4. Windows10安装TeXlive和TeXstudio
  5. Linux的Open Files设置过小导致程序退出并且Unable to create new native thread
  6. linux发挥不出显卡性能,Ubuntu 9.04 显卡性能不佳问题的解决
  7. 泛型与继承的关系,通配符
  8. NDK开发基础④增量更新之客户端合并差分包
  9. Citrix XenApp/XenDesktop版本正确选择
  10. python3官方说明文档_Python3 官方文档翻译 - 4.7 函数定义
  11. 写一个搜索引擎系统(Java版)
  12. 跟狗屎一样的代码,到底该如何重构?
  13. 一个很精致的HelloWorld,你看得懂么?
  14. php增加sqlserver扩展
  15. webpack 3.0 + 从切图仔到前端工程师-姜威-专题视频课程
  16. 电路原理图中的各种地(数字地、模拟地、信号地、直流地、交流地、屏蔽地)的区别
  17. 淘宝运营 淘宝选关键词的六种方法
  18. 光盘刻录大师 5.0
  19. ---中南海香烟---系列[男人应该抽的烟]
  20. RStudio控制台(console)中出现少量中文乱码的解决方法

热门文章

  1. 【用ArcGIS制作一张好看的中国月度气温图
  2. 5g网速用什么软件测试手机,5G时代到底有多快?测速软件谁最靠谱?
  3. android双日期选择器,AndroidPicker 安卓选择器类库,包括日期选择器、时间选择器、单项选择器、双项选择器、城市地址选择器、车牌号选择器 @codeKK Android开源站...
  4. html 游戏解锁,html5塔楼游戏,来啊,盖楼啊,带教程!
  5. 显示器驱动程序 NVIDIA Windows Kernel Mode Driver Version 已停止响应 并且己成功恢复 解决方法
  6. uni-app luch-request请求库简易配置
  7. 独家|胡郁出任讯飞消费者事业群总裁,物联网时代输入法战争启幕
  8. 点滴关怀PHP面试,真帮实干显真情 点滴关怀暖人心
  9. BBC纪录片《数学的故事》(附网盘资源)
  10. 完美驱动 AppleHDA