前言
Openfire 官网 http://www.igniterealtime.org/。
移动互联网让 IM 系统再一次活跃,openfire 为国内很多企业带来了便捷。本人在刚开始使
用 openfire 的时候,也刚到很渺茫。网上关于 openfire 一些相关的资料特别的少。那一个痛
苦啊!不过现在 openfire 已经有越来越多的人来使用和学习了。感谢那些在网上分享文档、
共享的人。
本人做 openfire 已然有段时间了。今天将分享我目前所了解的 OF。之前有写过很多关
于 openfire 学习的片段文档,这几天有时间将之前的散文合并到一起 (当然书中也有小部分
是从网上大牛那得到来的比图 Tsung 这个部分)。结果发现这些零散的学习片段还比较多。
本打算着写一本《OpenFire 深入浅出》的书籍。不过考虑本人资历尚浅,就算发版了,估计
也没几个人能看吧,呵呵。作者使用的 openfire 版本是 3.8.1。目前最新的版本应该是 3.9.3。
版本上有写变化。读者也可以下载最新的版本学习。Ok 了。
故,本书就是一本学习笔记了。当然里面的内容,可能还是有些零散。还望读者谅解。
欢迎大家给我建议。
我的博客:http://blog.csdn.net/huwenfeng_2011
我的邮箱:624308915@qq.com
欢迎大家和我联系!
至此,感谢
2015.02.04
XMPP
XMPP
XMPP
XMPP 概述
XMPP : The Extensible Messaging and Presence Protocol
中文全称:可扩展通讯和表示协议
Xmpp 是一种类似于 http 的通讯传输协议,它是一个“包装”/“解包”的过程。
XMPP 适合新项目的优势:
� 无需投入成本制定协议
� 易于扩展
� 可迅速完成原型
� 适合各种容量系统,从100用户在线的系统到100万以上在线用户。
� 可扩展至 Web/Flash IM, Mobile IM 等各种场合,基本都有开源实现或 Library。
� 发展比较成熟稳定
基本网络结构
基本网络结构
基本网络结构
基本网络结构
XMPP 中定义了三个角色,客户端,服务器,网关。通信能够在这三者的任意两个之间
双向发生。服务器同时承担了客户端信息记录,连接管理和信息的路由功能。网关承担着与
异构即时通信系统的互联互通,异构系统可以包括 SMS(短信),MSN,ICQ 等。基本的网
络形式是单客户端通过 TCP/IP 连接到单服务器,然后在之上传输 XML。
功能功能功能功能
传输的是与即时通讯相关的指令。在以前这些命令要么用2进制的形式发送(比如 QQ),
要么用纯文本指令加空格加参数加换行符的方式发送(比如 MSN)。而 XMPP 传输的即时
通讯指令的逻辑与以往相仿,只是协议的形式变成了 XML 格式的纯文本。这不但使得解析
容易了,人也容易阅读了,方便了开发和查错。而 XMPP 的核心部分就是一个在网络上分
片段发送 XML 的流协议。这个流协议是 XMPP 的即时通讯指令的传递基础,也是一个非常
重要的可以被进一步利用的网络基础协议。所以可以说,XMPP 用 TCP 传的是 XML 流。
XMLXMLXMLXML 流和流和流和流和 XMLXMLXMLXML 节节节节
XML 流的定义:
一个 XML 流是一个容器,包含了两个实体之间通过网络交换的 XML 元素。一个 XML
流是由一个 XML 打开标签
(包含适当的属性和名字空间声明)开始的,流的结尾则
是一个 XML 关闭标签 。在流的整个生命周期,初始化它的实体可以通过流发送
大量的 XML 元素,用于流的握手(例如 TLS 握手 或 SASL 握手)或 XML 节(在这里指符
合缺省名字空间的元素,包括
,
, 或
元素)。“初始的流”由初始化
实体(通常是一个客户端或服务器)和接收实体(通常是一个服务器)握手,从接收实体来
看,它就是那个初始实体的"会话"。初始化流允许从初始化实体到接收实体的单向通信;为
了使接收实体能够和初始实体交换信息,接收实体必须发起一个反向的握手(应答流)。
XML 节的定义:
一个 XML 节是一个实体通过 XML 流向另一个实体发送的结构化信息中的一个离散
的语义单位。一个 XML 节直接存在于根元素
的下一级,这样可以说是很好的匹配
了[XML]。任何 XML 节都是从一个 XML 流的下一级的某个打开标签(如
)开
始,到相应的关闭标签(如 )。一个 XML 节可以包含子元素(相关的属性、元素、
和 XML 字符数据等) 以表达完整的信息 。在这里定义的 XML 节仅限于
,
,和
元素。
stream
stream
stream
stream 属性属性属性属性
初始化方发给接收
方
接收方发给初始化方
说明
to
接收方的主机名 忽略
from
忽略
发送方的主机名
id
忽略
会话键值
xml:lang 缺省语言
缺省语言
version
支持 XMPP 1.0 支持 XMPP 1.0
该 属 性 仅 出 现 在 初 始 化 实 体 发 给 接 收 实 体 的
XML 流的头当中,并且它的值必须是接收实体所
在的主机名。若 'to' 属性出现在应答流中,则初
始化实体忽略它。
该 属 性 仅 出 现 在 接 收 实 体 发 给 初 始 化 实 体 的
XML 流的头当中,并且它的值必须是为当前初始
化实体授权的接收实体所在的主机名。
该属性仅用于接收实体发送给初始化实体 XML
流的头。这个属性是一个由接收实体创建的具有唯
一性的 ID,一个初始实体和接收实体之间的会话
ID,并且它在接收方的应用程序中必须是唯一的。
注意:这个流 ID 必须是足够安全的,所以它必
须是不可预知的和不可重复的。它不应该在有 'id'
属性出现在初始实体发送给接收实体的 XML 流
的头中;无论如何,如果'id'属性出现在初始化流
中,接收实体应该忽略它。
它包含在初始化实体发给接收实体的 XML 流的
头中,以指定在流中传输的可读 XML 字符所使用
的缺省语言。如果这个属性出现了,接收实体应该
记住它的值,作为初始化流和应答流的缺省属性;
如果这个属性没有出现,接收实体应该用一个可配
置的缺省值用于双方的流,这个属性值必须在应答
流的头中传达。对于所有初始化流中传输的节,如
果初始实体没有提供'xml:lang'属性,接收实体应该
应用缺省值;如果初始实体提供了'xml:lang'属性,
接收实体不能修改或删除它。'xml:lang'属性的值必
须是一个 nmtoken 并且必须遵守 RFC3066规定的
格式。
MinaMinaMinaMina 概述
Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一
个 较 新 的 项 目 , 它 为 开 发 高 性 能 和 高 可 用 性 的 网 络 应 用 程 序 提 供 了 非 常 便
利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开
发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。
Apache MINA 也称为:
● NIO 框架库
● 客户端服务器框架库
● 一个网络套接字库
MINA 虽然简单但是仍然提供了全功能的网络应用程序框架:
● 为不同的传输类型提供了统一的 API:
○ 通过 Java NIO 提供 TCP/IP 和 UDP/IP 支持
○ 通过 RXTX 提供串口通讯(RS232)
○ In-VM 管道通讯
○ 你能实现你自己的 API!
● 过滤器作为一个扩展特性; 类似 Servlet 过滤器
● 低级和高级的 API:
○ 低级: 使用字节缓存(ByteBuffers)
○ 高级: 使用用户定义的消息对象(objects)和编码(codecs)
● 高度定制化线程模型:
○ 单线程
○ 一个线程池
○ 一个以上的线程池(也就是 SEDA)
● 使用 Java 5 SSL 引擎提供沙盒(Out-of-the-box) SSL • TLS • StartTLS 支持
● 超载保护和传输流量控制
● 利用模拟对象进行单元测试
● JMX 管理能力
● 通过 StreamIoHandler 提供基于流的 I/O 支持
● 和知名的容器(例如 PicoContainer、Spring)集成
● 从 Netty 平滑的迁移到 MINA, Netty 是 MINA 的前辈。
总之:它是一个封装底层 IO 操作,提供高级操作 API 的通讯框架!
Mina 是底层数据传输和用户应用程序交互的接口
Mina 处于中间层,它不关心底层网络数据如何传输,只负责接收底层数据,过滤并转
换为 Java 对象提供给我们的应用程序,然后把应用程序响应值过滤并转换为底层识别的字
节,提供给底层传输;