没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Android XMPP 即时通讯 Openfire 二次开发
基础简介
XMPP
Extensible Messaging and Presence Protocol,简单的来讲,它就是一个发送接收处理消
息的协议,但是这个协议发送的消息,既不是二进制的东东也不是字符串,而是 XML。正
是因为使用了 XML 作为消息传递的中介,Extensible 才谈的上,不是么?
IM
Instant Messenger,及时通信软件,就是大家使用的 QQ、MSN Messenger 和 Gtalk 等等。
其中 Gtalk 就是基于 XMPP 协议的一个实现,其他的则不是。当前 IM 几乎作为每个上网者
必然使用的工具,在国外的大型企业中有一些企业级的 IM 应用,但是其商业价值还没完
全发挥出来。设想既然 XMPP 协议是一个公开的协议,那么每个企业都可以利用它来开发
适合本身企业工作,提高自身生产效率的 IM;甚至,你还可以在网络游戏中集成这种通信
软件,不但让你可以边游戏边聊天,也可以开发出适合游戏本身的 IM 应用,比如说一些
游戏关键场景提醒功能,团队语音交流等等都可以基于 IM 来实现。
Spark Smack 和 Openfire
开源界总是有许多有趣的东东,这三个合起来就是一个完整的 XMPP IM 实现。包括
服务器端——Openfire,客户端—— Spark,XMPP 传输协议的实现——Smack(记住,
XMPP 是一个协议,协议是需要实现的,Smack 起到的就是这样的一个作用)。三者都是
基于 Java 语言的实现。
Spark 提供了客户端一个基本的实现,并提出了一个很好的插件架构,这对于开发者
来说不能不说是一个福音。我强烈建议基于插件方式来实现你新增加的功能,而不是去改
它的源代码,这样有利于你项目架构,把原始项目的影响降到最低。
Openfire 是基于 XMPP 协议的 IM 的服务器端的一个实现,虽然当两个用户连接后,
可以通过点对点的方式来发送消息,但是用户还是需要连接到服务器来获取一些连接信息
和通信信息的,所以服务器端是必须要实现的。Openfire 也提供了一些基本功能,但真的
很基本的!庆幸的是,它也提供插件的扩展,像 Spark 一样,同样强烈建议使用插件扩展
的方式来增加新的功能,而不是修改人家的源代码。
Smack 是一个 XMPP 协议的 Java 实现,提供一套可扩展的 API,不过有些时候,你还
是不得不使用自己定制发送的 XML 文件内容的方式来实现自己的功能
下图展示了三者之间的关系:
从 图 上 可
以 了 解 到 ,
client 端 和
server 端 都 可
以通过插件的
方式来进行扩
展 , smack 是
二者传递数据的媒介。
Apache MINA
Openfire 的通信处理基于 Apache MINA 框架实现。Apache MINA 是一个网络应用程序
框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序。它提供了一个通过
Java NIO 在不同的传输例如 TCP/IP 和 UDP/IP 上抽象的事件驱动的异步 API。
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 的前辈。
命名规则
Openre 中 常 见 的 类 名 后 缀 命 名 包 括
Starter、Plugin、Listener、Dispatcher、Handler、Manager、Provider
,通常情况下,这些命名类包括如下意义:
XXStarter
系统启动类,如 org.jivesoftware.openre.starter.ServerStarter,调
用其 start()方法可启动系统应用。
XXListener
业务的最终处理类。
XXDispatcher
调度类,其中有很多关键方法,如 addListener(),以组合的方式,为类
内 定 义 的 静 态 Set<XXListener> 实 例 添 加 XXListener 对 象 。 以 便 调 用
dispatchEvent(String property, EventType eventType, Map<String,
Object> params) 方法遍历处理 Set 集中的 XXListener 对象(通过 调 用
XXListener 对象的各实际方法完成实际业务)。
XXPlugin
实 现 Plugin 接 口 的 插 件 类 , 需 实 现 initializePlugin(PluginManager
manager, File pluginDirectory)方法和 destroyPlugin()方法。在其初始化
方 法 中 调 用 Dispatcher 实 现 类 的 addListener() 方 法 如
PropertyEventDispatcher.addListener(this)。
XXProvider
实现面向接口编程方式的接口类,通过反射机制创建具体实现类的对象,
反射类名配置在 ofproperty 表对应的记录 propvalue 属性中。若没有相关配
置,则调用默认实现类,默认实现类类名命名规则为 DefaultXXProvider。
XXHandler
实 际 处 理 类 , 以 ConnectionHandler 为 例 , 在
org.jivesoftware.openre.spi. ConnectionManagerImpl 类 的
startClientSSLListeners(String localIPAddress)方法中,有这样一段代码:
sslSocketAcceptor.bind(new InetSocketAddress(bindInterface, port),
new ClientConnectionHandler(serverName));其中bind方法的第二个参
数是新创建的一个ClientConnectionHandler的实例,而它就是
ConnectionHandler的一个子类。
系统配置项
Openre 的系统配置项采用文件结合数据库表的方式配置,也有部分默认
配 置 项 通 过 Java 硬 编 码 方 式 配 置 ( 如 org.jivesoftware.openre.
ConnectionManager 接 口 类 中 定 义 的
DEFAULT_PORT、DEFAULT_SSL_PORT、DEFAULT_COMPONENT_PORT
等),Openre 中比较重要的配置位置包括:
一、 src/conf 目录下的 openre.xml 配置文件。该配置文件为系统核心配
置文件。在第一次启动 Openre 并通过管理控制台完成安装配置后会往
该配置文件中填入相应的配置信息。
二、 plugin.xml 配置文件。该配置文件为各插件包下的核心配置文件,由
它确定插件核心处理类和相应页面插件的展现等。配置项及含义详见官方
插件开发说明部分。
三、 web.xml 和 web-custom.xml 配置文件。用于配置 servlet 和用户自
定义 servlet(插件页面用,放在插件对应目录下)。
四、 ofproperty 中 的 各 条 记 录 , 该 表 中 包 括 两 个 字 段 name 和
propvalue,分别代表配置项名和配置项值。
系统启动流程
系 统 启 动 时 调 用 ServerStarter 类 中 的 start() 方 法 , 通 过 反 射 加 载
org.jivesoftware.openre.XMPPServer 类文件,创建实例时调用其构造函
数,在其构造函数中调用其 start()方法实际启动服务应用程序。Start()方法中
首先调用 verifyDataSource()方法验证并确保数据库可以访问,然后会调用
loadModules();initModules();startModules();方法来对 Module 接口的实现类的
各子类进行操作,依次完成模块的加载、初始化和启动操作。loadModules()方法中会调用
loadModule(String module)方法通过反射加载各模块类,参数字符串 module 为对应的
模块核心处理类的类名,如 AdHocCommandHandler。现以 AdHocCommandHandler 为例对
接下来的处理流程进行说明。通过 loadModule 创建 AdHocCommandHandler 类实例时调用
其 构 造 函 数 , 在 构 造 函 数 中 初 始 化 了 其 私 有 AdHocCommandManager 对 象 。 在
initModules() 时 调 用 AdHocCommandHandler 实 例 的 initialize(XMPPServer
server) 方 法 对 其 私 有 属 性 对 象 进 行 初 始 化 。 然 后 调 用 start() 方 法 , 调 用
addDefaultCommands 方 法 添 加 命 令 并 启 动 命 令 ( 通 过 调 用
startCommand(AdHocCommand command)方法实现)。
网络处理
消息监听服务
SSL 等 监 听 服 务 的 调 度 在 ConnectionManagerImpl 类 中 实 现 。
ConnectionManagerImpl.createClientSSLListeners()方法启动 SSL 监听
消息封装
信 息 处 理 采 用 XML 节 的 方 式 传 递 信 息 , 消 息 封 装 通 常 采 用
IQ、Message、Presence。
剩余63页未读,继续阅读
资源评论
- xianyu7152015-06-22不错的 文档
- quanshuangwu2015-10-12有待细细研究
- qq_200062052015-07-12内容有点多,慢慢看....
- lockepeng2015-04-13真多,有95页~~
- 椰子z2016-03-23真的多,90多页,看了两眼,写的蛮详细的,但是还太适合我刚接触看,我还是去看smack的文档吧。。。
Duke29
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功