当前位置:文档之家› Openfire二次开发问题分析及解决

Openfire二次开发问题分析及解决


53
实用第一 智慧密集
协 议 。 当 然 , 也 可 以 建 立 其 他 的 Java 文 件 来 辅 助 其 完 成 相 应 功能。
在编写该 Java 文件时需要注意的几个地方: (1) 实 现 processPacket 接 口 时 , 需 要 组 装 一 个 packet 并 通 过 componentManager.sendPacket 发 送 出 去 , 该 组 装 通 过 handleIQRequest 来 完 成 , 而 handleIQRequest 中 只 需 完 成 对 插 件 自 身 命 名 空 间 的 编 写 , 其 余 的 XMPP 标 准 协 议 的 部 分 不 需 考虑。 (2) 该 Java 文 件 如 果 实 现 交 互 式 的 功 能 , 则 面 向 客 户 的 显示界面由 plugins.xml 中定义 的 url (jsp 文 件 ) 完 成 , 功 能 部 分 由 该 Java 文 件 完 成 , 如 果 实 现 的 不 是 交 互 式 的 功 能 , 可 以 直接在该 Java 文件中完成, 无需显示。 (3) 命名空间需要自己新建。 如 Search 插件 SearchPlubin.java 文件第 268 行
2.1 插件开发分析
2.1.1 新插件要在 Openfire\src\plugins\ 中声明该插件 新建一个该插件的文件夹, 一般情况下所必须的文件有: (1) lib 文件夹: 存放所需类库。 (2) src 文件夹: 存放相关源文件。 (3) database 文 件 夹 : 位 于 sec 文 件 夹 下 , 如 果 插 件 需 要
2.2 插件开发
这里以自己开发的 “组织机构管理” 插件为例, 简要介绍 插件开发的实现 。 开发 环 境 为 Openfire3_6_4+JDK1.6.0+ MyEclipse5.1.0 (下同)。 首先, 准备需要的文 件 , 经 分 析 , 插 件 要 进行人机交互, 需要提供中文的交互界面, 并且需要对数据库 进行某些修改或添加。 根据上文对插件开发的分析, 需要提供 上文提到的全部文件。
</tab> </adminconsole>
这样, 插件制作完成, 最后效果如图 1 所示。
图 1 组织机构管理插件
3 Openfire 源代码修改分析与解决
只要插件能胜任的工作, 建议都使用插件完成, 毕竟一旦 修改源代码, 带来的未知风险随之大大增加。 但是, 再某些特 定的情况下不得不进行源代码的修改时, 尽量进行小的改动达 到目的, 除非已经完全读懂全部的 Openfire 代码。 在修改完成 后要针对改后的服务器进行大量细致的测试, 保证所作改动不 会影响其他功能的正常运行。
2 Openfire 插件开发问题分析与解决
作 为 一 款 较 为 成 熟 的 开 源 服 务 器 软 件 , Openfire 为 了 用 户 二次开 发 的 扩 展 , 提 供 了 良 好 的 插 件 支 持 模 式 。 对 于 Openfire 功能扩展, 一般情况下可直接使用开发插件的方式实现, 并且 在大多数情况下, 开发出来的插件是可以跨版本使用的, 这就 为向 Openfire 中添加功能提供了很好的支持。
※类文件名。 完整名称, 包括其包名 名称
<description> <author>
简要说明, 显示于插件页面 作者
<version> <date>
版本 日期
<minServerVersion> <databaseKey>
※最低服务器版本 数据库密码, 经常不使用
<databaseVersion>
return;
54 2011. 03
NETWORK & COMMUNICATION
网络与通信
} char lastChar = buf[readByte-1]; if (lastChar >= 0xfff0) {
if (Log.isDebugEnabled()) { Log.debug ("Waiting to get complete char: " +
3.1 Openfire 源代码修改与分析
首先, 如果出现问题, 应定位该问题出现的代码段, 并确 定 该 代 码 段 所 属 的 jar 包 , 一 旦 进 行 修 改 , 只 需 打 包 该 jar 包 , 并替换到服务器中即可完成相关的修改。
举个例子来说明: 在 使 用 Openfire 服 务 器 进 行 即 时 消 息 系 统 搭 建 的 过 程 中 , 发 现 进 行 UTF-8 编 码 的 中 文 传 输 经 常 会 有 乱 码 出 现 , 并 且 出 现的非常有规律, 每次都是一个字变成了 “??”, 如
NETWORK & COMMUNICATION
网络与通信
O penfire 二次开发问题分析及解决
苑 为 陶卓彬
摘 要: 随着计算机技术的迅猛发展, 开源软件的二次开发利用逐渐成为进行快速开发的主要手 段。 针对利用开源软件 Openfire 二次开发搭建即时消息系统平台时遇到的问题, 分析并提出了相 应的解决方案, 并阐述了这些方案的实现。 关键词: Openfire; 即时消息系统; 二次开发
首 先 建 立 了 一 个 Group 文 件 夹 , 在 其 中 建 立 了 lib、 src 文 件 夹 , src 文 件 夹 中 建 立 database、 i18n、 java、 web 文 件 ቤተ መጻሕፍቲ ባይዱ 并 创 建 了 相 应 的 文 件 。 根 据 插 件 功 能 的 需 要 , 编 写 了 DefaultGroupTreeProvider、 GroupTreeManager、 GroupTreeNode、 GroupTreeProvider 这 4 个 Java 文 件 来 辅 助 Group3Plugin.java 完 成 相 应功能。 并在 Web 文件夹中建立了人 机 交 互 界 面 group3-form. jsp, 并在 plugin.xml 文件中对其显示位置进行描述:
invalidateBuffer(); if (buffer.length() > maxBufferSize) {
throw new Exception("Stopped parsing never ending stanza");
} CharBuffer charBuffer = encoder.decode (byteBuffer. buf()); char[] buf = charBuffer.array(); int readByte = charBuffer.remaining(); if (readByte == 0) {
建立该 Java 文件, 在一般情况下需继承 3 个接口: (1) Plugin: 包 含 必 须 实 现 的 initializePlugin 和 destroyPlugin 两 个 接 口 , initializePlugin 插 件 建 立 , destroyPlugin 插 件 销毁。 (2) PropertyEventListener: 服 务 器 监 听 接 口 , 没 有 此 接 口 无法响应客户端的请求。 一般不需要与客户端有交互的插件没 有继承此接口。 (3) Component: 管理收发的接口。 该 Java 文件将完成插件的主要 工 作 。 Openfire 已 经 封 装 好 了 XMPP 协 议 , 因 此 交 互 上 只 需 考 虑 封 装 的 内 容 , 封 装 后 的 传 输 由 XMPP 协 议 完 成 , 除 非 想 放 弃 XMPP 协 议 而 改 用 其 他
数据库版本
<adminconsole>
显示位置, 其中的 url 指向点 击 后 显 示 的 界 面 ; Name 指明显示名称; description 指明鼠标悬停显示。
(7) 其 他 文 件 : changelog.html 版 本 信 息 、 readme.html 说 明、 logo_large.gif\logo_small.gif 图标等。 2.1.2 在 pulgins.xml 文件中描 述 的<class>处 建 立 该 插 件 Java 文件
1 引言
Openfire 是 一 款 开 源 的XMPP 服 务 器 软 件 , 经 常 作 为 搭 建 即时消息系统的服务器端使用, 其优良的性能以及良好的可 扩展性为多种模式的即时通信系统提供了强有力的支持。 可 二次开发的开源的模式也为用户制作具有自身特色的服务器 提供了良好的支持。
下文针对在使用 Openfire 服务器进行二次开发 中 遇 到 的 问 题, 结合自身特点和需要, 提出了相应的解决方案, 并重点 介 绍 了 Openfire 服 务 器 插 件 开 发 和 源 码 修 改 等 方 面 的 设 计 与 实现。
如 果 截 断 点 是 一 个 汉 字 编 码 的 结 尾 , 那 么 不 会 出 现 “??”, 如
于 是 , 将 原 来 有 ByteBuffer 转 换 成 CharBuffer 的 过 程 改 写 , 做 了 一 个 循 环 , 如 果 存 在 ByteBuffer 不 完 整 ( 即 存 在 截 断 点 ) , 那 么 将 其 放 置 到 一 个 tmp 变 量 中 , 再 将 tmp 与 下 一 个 ByteBuffer 相 结 合 , 直 到 其 完 整 后 再 转 换 为 CharBuffer, 这 样 转 换 出来的汉字就不会存在 “??” 了。 这样做的好处是, 及解决了 乱 码 的 BUG, 又 不 改 变 原 来 程 序 的 运 行 方 式 , 非 中 文 或 者 完 整的 ByteBuffer 会 直 接 进 行 原 来 的 操 作 , 只 有 出 现 截 断 点 的 不 完整 ByteBuffer 才 会 进 行 编 写 的 代 码 , 拼 凑 成 完 整 的 , 这 大 大 降低了出现隐形问题的可能。
相关主题