转: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基础知识的更多相关文章

  1. (转)OpenFire源码学习之二十七:Smack源码解析

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43484199 Smack Smack是一个用于和XMPP服务器通信的类库,由此可以实现即 ...

  2. (转)OpenFire源码学习之十八:IOS离线推送

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43458213 IOS离线推送 场景: 如果您有iOS端的APP,在会话聊天的时候,用户登 ...

  3. (转)OpenFire源码学习之十:连接管理(上)

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43415827 关于连接管理分为上下两部分 连接管理 在大并发环境下,连接资源 需要随着用 ...

  4. (转)OpenFire源码学习之七:组(用户群)与花名册(用户好友)

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413651 Group 在openfire中的gorop——组,也可以理解为共享组.什 ...

  5. (转)OpenFire源码学习之六:用户注册

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413509 用户注册 注册流程: 1.客户端进行握手给服务端发送连接消息: <s ...

  6. (转)OpenFire源码学习之四:openfire的启动流程

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413233 openfire启动 ServerStarter 启动流程图: 启动的总入 ...

  7. (转)即时通讯IM OpenFire源码学习之三:在Eclipse中构建源码

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43412617 源码搭建 下载地址: 地址:http://www.igniterealti ...

  8. 【mybatis源码学习】mybtias基础组件-占位符解析器

    一.占位符解析器源码 1.占位符解析器实现的目标 通过解析字符串中指定前后缀中的字符,并完成相应的功能. 在mybtias中的应用,主要是为了解析Mapper的xml中的sql语句#{}中的内容,识别 ...

  9. Jquery源码中的Javascript基础知识(三)

    这篇主要说一下在源码中jquery对象是怎样设计实现的,下面是相关代码的简化版本: (function( window, undefined ) { // code 定义变量 jQuery = fun ...

  10. Jquery源码中的Javascript基础知识(一)

    jquery源码中涉及了大量原生js中的知识和概念,文章是我在学习两者的过程中进行的整理和总结,有不对的地方欢迎大家指正. 本文使用的jq版本为2.0.3,附上压缩和未压缩版本地址: http://a ...

随机推荐

  1. 【LeetCode 31】下一个排列

    题目链接 [题解] 从右往左找第一个下降的位置i(即满足nums[i]<nums[i+1]); 然后在[i+1..len-1]这个区间里面找到一个最大的下标k,使得nums[k]>nums ...

  2. Gym101158 J 三分 or 模拟退火 Cover the Polygon with Your Disk

    目录 Gym101158 J: 求圆与给定凸多边形最大面积交 模拟退火 三分套三分 模拟退火套路 @ Gym101158 J: 求圆与给定凸多边形最大面积交 传送门:点我点我 求 $10 $ 个点组成 ...

  3. Losing session data in ASP.NET

    Losing session data in ASP.NET By default Response.Redirect terminates thread execution and there mi ...

  4. STM32 系统架构

    这里所讲的 STM32 系统架构主要针对的 STM32F103 这些非互联型芯片 STM32 主系统主要由四个驱动单元和四个被动单元构成. 四个驱动单元是: 内核 DCode 总线; 系统总线;通用  ...

  5. PHP定时任务实现(计划任务 vs node.js)

    PHP自动任务(单线程) 一.计划任务实现 :最终需要在服务器(windows)上 设置计划任务 1.写好php任务文件 auto.php:链接数据库 判断条件操作数据库 2.创建bat文件 例:ru ...

  6. javascript闭包实现缓存小案例

    ​ /* * 闭包实现缓存 * 属性:有个键--值 --->所以可以将缓存数据存放在一个对象中 * 方法:缓存存储 setCache * 缓存的获取 getCache * */ function ...

  7. VS2008的使用

    文章转载自:http://www.cnblogs.com/aduck/archive/2011/11/11/2245460.html 1.如何在vc2008中显示行号 中文版: 菜单-工具-选项 在新 ...

  8. mysql中BLACKHOOL的作用

    MySQL在5.x系列提供了Blackhole引擎–"黑洞". 其作用正如其名字一样:任何写入到此引擎的数据均会被丢弃掉, 不做实际存储:Select语句的内容永远是空. 和Lin ...

  9. jsp 内置对象HTTP协议

    有些对象不用声明就能够在JSP页面的脚本部分使用,这就是JSP的内置对象. JSP的内置对象有:request .response.session.application.out. 下面我们将一一介绍 ...

  10. Java-技术专区-技术栈分析辨证方法

    1.好多公司动不动就JVM.高并发.分布式.微服务等等,我没有实际经验. 2.从事Java开发三年了,目前的职位是高级Java工程师,感觉技术和工资都到了瓶颈,对以后的发展方向有些迷茫. 3.加班时间 ...