(转)OpenFire源码学习之一:XMPP基础知识
转:http://blog.csdn.net/huwenfeng_2011/article/details/43412919
前面两张主要讲基础部分。XMPP与Mina有部分抄写于互联网的其他大事
XMPP概述
XMPP: The Extensible Messaging and Presence Protocol
中文全称:可扩展通讯和表示协议
Xmpp是一种类似于http的通讯传输协议,它是一个“包装”/“解包”的过程。
XMPP适合新项目的优势:
l 无需投入成本制定协议
l 易于扩展
l 可迅速完成原型
l 适合各种容量系统,从100用户在线的系统到100万以上在线用户。
l 可扩展至 Web/Flash IM, Mobile IM 等各种场合,基本都有开源实现或Library。
l 发展比较成熟稳定
基本网络结构
XMPP中定义了三个角色,客户端,服务器,网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接管理和信息的路由功能。网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML。
功能
传输的是与即时通讯相关的指令。在以前这些命令要么用2进制的形式发送(比如QQ),要么用纯文本指令加空格加参数加换行符的方式发送(比如MSN)。而XMPP传输的即时通讯指令的逻辑与以往相仿,只是协议的形式变成了XML格式的纯文本。这不但使得解析容易了,人也容易阅读了,方便了开发和查错。而XMPP的核心部分就是一个在网络上分片段发送XML的流协议。这个流协议是XMPP的即时通讯指令的传递基础,也是一个非常重要的可以被进一步利用的网络基础协议。所以可以说,XMPP用TCP传的是XML流。
XML流和XML节
XML流的定义:
一个XML流是一个容器,包含了两个实体之间通过网络交换的XML元素。一个XML流是由一个XML打开标签 <stream> (包含适当的属性和名字空间声明)开始的,流的结尾则是一个XML关闭</stream>标签 。在流的整个生命周期,初始化它的实体可以通过流发送大量的XML元素,用于流的握手(例如 TLS 握手 或 SASL 握手)或XML节(在这里指符合缺省名字空间的元素,包括<message/>,<presence/>,或 <iq/> 元素)。“初始的流”由初始化实体(通常是一个客户端或服务器)和接收实体(通常是一个服务器)握手,从接收实体来看,它就是那个初始实体的"会话"。初始化流允许从初始化实体到接收实体的单向通信;为了使接收实体能够和初始实体交换信息,接收实体必须发起一个反向的握手(应答流)。
XML节的定义:
一个XML节是一个实体通过 XML 流向另一个实体发送的结构化信息中的一个离散的语义单位。一个XML节直接存在于根元素<stream/>的下一级,这样可以说是很好的匹配 了[XML]。任何XML节都是从一个XML流的下一级的某个打开标签(如 <presence>)开始,到相应的关闭标签(如 </presence>)。一个XML节可以包含子元素(相关的属性、元素、和 XML 字符数据等) 以表达完整的信息。在这里定义的XML节仅限于<message/>,<presence/>,和 <iq/> 元素。
stream 属性
|
初始化方发给接收方 |
接收方发给初始化方 |
说明 |
to |
接收方的主机名 |
忽略 |
该属性仅出现在初始化实体发给接收实体的 XML 流的头当中,并且它的值必须是接收实体所在的主机名。若 'to' 属性出现在应答流中,则初始化实体忽略它。 |
from |
忽略 |
发送方的主机名 |
该属性仅出现在接收实体发给初始化实体的 XML 流的头当中,并且它的值必须是为当前初始化实体授权的接收实体所在的主机名。 |
id |
忽略 |
会话键值 |
该属性仅用于接收实体发送给初始化实体 XML流的头。这个属性是一个由接收实体创建的具有唯一性的ID,一个初始实体和接收实体之间的会话ID,并且它在接收方的应用程序中必须是唯一的。注意:这个流 ID 必须是足够安全的,所以它必须是不可预知的和不可重复的。它不应该在有 'id'属性出现在初始实体发送给接收实体的 XML流的头中;无论如何,如果'id'属性出现在初始化流中,接收实体应该忽略它。 |
xml:lang |
缺省语言 |
缺省语言 |
它包含在初始化实体发给接收实体的 XML流的头中,以指定在流中传输的可读XML字符所使用的缺省语言。如果这个属性出现了,接收实体应该记住它的值,作为初始化流和应答流的缺省属性;如果这个属性没有出现,接收实体应该用一个可配置的缺省值用于双方的流,这个属性值必须在应答流的头中传达。对于所有初始化流中传输的节,如果初始实体没有提供'xml:lang'属性,接收实体应该应用缺省值;如果初始实体提供了'xml:lang'属性,接收实体不能修改或删除它。'xml:lang'属性的值必须是一个 nmtoken并且必须遵守RFC3066规定的格式。 |
version |
支持XMPP 1.0 |
支持XMPP 1.0 |
示例:
<?xml version='1.0'?>
<stream:stream
from='test@montenets.com'
to='im.example.com'
version='1.0'
xml:lang='en'
xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'>
基本节点
<presence>节点
presence节点用来控制和表示实体的在线状态,可以展示从离线到在线甚至于离开,不能打扰等复杂状态,另外,还能被用来建立和结束在线状态的订阅。
<presence>
<show>away</show> <!--离线-->
<status>atthe ball</status> <!--标签用于显示额外信息-->
</presence>
其中show的取值范围如下:
away: 离线
char: 交谈中
dnd: 希望不被打扰
xa: 离开一段时间
Online: 在线
<presence>
<status>touring thecountryside</status>
<priority>10</priority>
</presence>
在这个节中,出现了一个<priority>标签,表示现在连接的优先度。每个连接可以设置从-128到127的优先读,默认是设置为0.用户可以在这个标签里修改相应的优先度。如果有相应的设置的话,用户送往纯JID的将会送 到优先度最高的那个连接,如果设置值为负数的话,则表示送往纯JID的消息将永远不会送达该连接。
<Message>节点
message节点用于用户之间传递消息。这消息可以是单纯的聊天信息,也可以某种格式化的信息。 message节点信息是传递之后就被忘记的。当消息被送出之后,发送者是不管这个消息是否已经送出或者什么时候被接收到。通过扩展协议,可以改变这样一种状况。
下面我们看一些例子:
<messagefrom="test_a@jabber.org" to="test_b@jabber.org" type="chat">
<body>Hello!</body>
</message>
<message from="test_a@jabber.org" to="test_b@jabber.org" type="groupchat">
<body>welcome</body>
</message>
其中<type>标签取值类型:
Chat: 单点聊天
Error: 错误信息
groupchat: 多人聊天信息
headline: 通常用在自动服务中,不需要回应。
<body> 标签里面是具体的消息内容。
<iq>节点
iq节点主要是用于Info/Query模式的消息请求,他和Http协议比较相似。可以发出get以及set请求,就如同http中的GET以及POST。iq节点需要有回应,有get,set两种请求以及result,error两种回应。
<iq from="test_a@jabber.org" type="get" id="roster1">
<queryxmlns="jabber:iq:roster"/>
</iq>
其中type属性取值:
Get: 获取当前域值
Set: 设置替换get查询的值
Result: 说明成功相应了先前的查询
Error: 查询或相应时候出现了错误
拓展协议
(转)OpenFire源码学习之一:XMPP基础知识的更多相关文章
- (转)OpenFire源码学习之二十七:Smack源码解析
转:http://blog.csdn.net/huwenfeng_2011/article/details/43484199 Smack Smack是一个用于和XMPP服务器通信的类库,由此可以实现即 ...
- (转)OpenFire源码学习之十八:IOS离线推送
转:http://blog.csdn.net/huwenfeng_2011/article/details/43458213 IOS离线推送 场景: 如果您有iOS端的APP,在会话聊天的时候,用户登 ...
- (转)OpenFire源码学习之十:连接管理(上)
转:http://blog.csdn.net/huwenfeng_2011/article/details/43415827 关于连接管理分为上下两部分 连接管理 在大并发环境下,连接资源 需要随着用 ...
- (转)OpenFire源码学习之七:组(用户群)与花名册(用户好友)
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413651 Group 在openfire中的gorop——组,也可以理解为共享组.什 ...
- (转)OpenFire源码学习之六:用户注册
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413509 用户注册 注册流程: 1.客户端进行握手给服务端发送连接消息: <s ...
- (转)OpenFire源码学习之四:openfire的启动流程
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413233 openfire启动 ServerStarter 启动流程图: 启动的总入 ...
- (转)即时通讯IM OpenFire源码学习之三:在Eclipse中构建源码
转:http://blog.csdn.net/huwenfeng_2011/article/details/43412617 源码搭建 下载地址: 地址:http://www.igniterealti ...
- 【mybatis源码学习】mybtias基础组件-占位符解析器
一.占位符解析器源码 1.占位符解析器实现的目标 通过解析字符串中指定前后缀中的字符,并完成相应的功能. 在mybtias中的应用,主要是为了解析Mapper的xml中的sql语句#{}中的内容,识别 ...
- Jquery源码中的Javascript基础知识(三)
这篇主要说一下在源码中jquery对象是怎样设计实现的,下面是相关代码的简化版本: (function( window, undefined ) { // code 定义变量 jQuery = fun ...
- Jquery源码中的Javascript基础知识(一)
jquery源码中涉及了大量原生js中的知识和概念,文章是我在学习两者的过程中进行的整理和总结,有不对的地方欢迎大家指正. 本文使用的jq版本为2.0.3,附上压缩和未压缩版本地址: http://a ...
随机推荐
- OC学习篇之---谓词(NSPredicate)
在前一篇文章中我们介绍了OC中一个重要技术通知:http://blog.csdn.net/jiangwei0910410003/article/details/41923401,今天我们在来看一下OC ...
- Android_开发片段(Part 1)
1.maven环境配置时也跟java类似,进行我的电脑环境的设置,cmd查询:mvn -version 2.在新建AVD时,要注意AVD的版本(API),版本太低或者太高,经常不能运行项目或者在运行项 ...
- Windows-右键菜单添加选项
新建 add.reg 输入选项名和选项对应程序路径 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\选项名] [HKEY ...
- Oracle10gr2 开机自启动脚本
目录 目录 软件环境 Oracle服务启动停止重启脚本 软件环境 操作系统 RHEL6.1 软件 Oracle10gr2 Oracle服务启动.停止.重启脚本 su - oracle cd /u01/ ...
- Android 发布自动版本号方案
以前看到一些自动化版本号打包的文章.如果您的项目是用 Git 管理的,并且恰巧又是使用 Gradle 编译(应该绝大部分都是这样的了吧?),本文试图找到一种更加优雅的自动版本管理方法. 背景 我们都知 ...
- 全局配置一个ajax的错误监控
全局配置一个ajax的错误监控,比如$(document).ajaxError(function(evt, req, settings){ if(req && (req.stat ...
- 微信小程序观察者模式 observers
const app = getApp(); const request = require('../../../utils/request.js'); Component({ options: { m ...
- 将libvex移植到Visual Studio编译平台下的经验总结
1. 两难 将libvex从Linux移植到Windows,移植工作聚集于Cross-Compiler,而不是预料的Cross-Platform. VC++ Compiler到目前为止只支持C89标准 ...
- Forgery CodeForces - 1059B
一道印章刻印的题目: 具体要求:有一个固定的3*3的印章,给你一个墨迹问能用这个印章印出墨迹吗?(一个像素可以多次被上色) 输入:第一行是墨迹的行列规模,接下来是墨迹 输出:If Andrey can ...
- EOJ 1127. 多边形面积(计算几何)
题目链接:1127. 多边形面积(计算几何) 题意 按逆时针顺序给出 \(n\) 个点的坐标,求这些点围成的多边形的面积. 思路 选择多边形上的一个点,然后每次枚举之后的两个点,计算叉积,注意要保留符 ...