此篇文章为《
开
发你自己的XMPP IM 续 - Openfire 插件开发
》的转发,原文章地址:
http://phoenixtoday.blogbus.com/logs/20285574.html
继续上一篇的内容,本篇文章介绍开发Openfire 的插件
这篇文章拖了很久了,呵呵,真是千呼万唤始出来呀。Openfire 服务器端是支持插件开发的,开发过程可能会涉及到数据库的操作,本篇文章专注于Openfire 插件的部分,对服务器端涉及到数据库的开发只做简单介绍。
Openfire 是一个用Java 实现的XMPP 服务器,客户端可以通过IQ 的方式与其进行通信(其实就是XML),客户端和服务器之间的通信是依靠底层Smack 库提供的各种功能来完成的。其实利用插件方式来扩展Openfire 服务器端主要有两种扩展方式,一种是对服务器控制台页面进行扩展(不是本文的主要内容),其实就是遵循Openfire 页面的布局方式,进行相应的页面扩展和功能扩展;另一种是对通信功能进行扩展。本文主要针对后者进行具体的描述
本篇文章的结构如下:
1、创建plugin.xml(这是整个插件最关键的文档)
2、创建服务器插件实例(实现Plugin 接口的一个类还有一批IQHandler)
3、打包插件(Openfire 插件也有自己的打包方式)和部署插件
好滴,实刀实枪的来动手做吧
1、创建plugin.xml
初次开发Openfire 和Spark 插件的时候,很容易把二者搞混,千万记得,这里是Openfire 的plugin.xml 不是第二篇文章说的那个啦!
<?xml version="1.0" encoding="UTF-8"?><plugin> <!-- Main plugin class 这里是最重要滴--> <class>com.im.server.plugin.GroupTreePlugin</class> <!-- Plugin meta-data --> <name>GroupTreePlugin</name> <description>This is the group plugin.</description> <author>Phoenix</author> <version>1.0</version> <date>14/03/2008</date> <url>http://localhost:9001/openfire/plugins.jsp</url> <minServerVersion>3.4.1</minServerVersion> <licenseType>gpl</licenseType> <!-- Admin console entries --> <adminconsole> <!-- More on this below --> </adminconsole></plugin>最重要的那一行我已经标记出来啦,就是你这个插件的初始化和垃圾清理类,例子中是在com.im.server.plugin 包中的GroupTreePlugin 类,下文会对这个类进行详细描述。其余的都是描述信息,只要你提供了正确的描述信息,一般都不会出错。建议初次开发者,在写完plugin.xml 文件后,写一个简单的Plugin 实例,并打印出一些信息,如果重新启动Openfire 信息成功显示,恭喜你,你已经迈出一大步了!
2、实现Plugin 类和IQHandler
Plugin 类主要起到的作用是初始化和释放资源,在初始化的过程中,最重要的的注册一批IQHandler,IQHander 的作用有点类似于Spark 中的IQProvider,其实就是解析XML 文件之后,生成一些有用的实例,以供处理。下面分别给出一个Plugin 类的实例和IQProvider 的实例
GroupTreePlugin 类
/** * 服务器端插件类 * * @author Phoenix * * Mar 14, 2008 11:03:11 AM * * version 0.1 */public class GroupTreePlugin implements Plugin{ private XMPPServer server; /* * (non-Javadoc) * * @see org.jivesoftware.openfire.container.Plugin#destroyPlugin() */ public void destroyPlugin() { } /* * (non-Javadoc) * * @see org.jivesoftware.openfire.container.Plugin#initializePlugin(org.jivesoftware.openfire.container.PluginManager, * java.io.File) */ public void initializePlugin(PluginManager manager, File pluginDirectory) { PluginLog.trace("注册群组树IQ处理器"); server = XMPPServer.getInstance(); server.getIQRouter().addHandler(new GroupTreeIQHander()); //1 server.getIQRouter().addHandler(new UserInfoIQHandler()); server.getIQRouter().addHandler(new DelUserIQHandler()); server.getIQRouter().addHandler(new CreateUserIQHandler()); server.getIQRouter().addHandler(new AddGroupUserIQHandler()); server.getIQRouter().addHandler(new SetRoleIQHandler()); }}上例所示,在初始化中先找到IQRouter,然后通过IQRouter 注册一批IQHandler,这些IQHander 会自动监听相应命名空间的IQ,然后进行处理;由于这个Plugin 不需要做资源释放的工作,所以在destroyPlugin() 方法中没有任何内容。具体的IQHander 类如下
GroupTreeIQHander
/** * 处理客户端发来的IQ,并回送结果IQ * * @author Phoenix * * Mar 14, 2008 4:55:33 PM * * version 0.1 */public class GroupTreeIQHander extends IQHandler{ private static final String MODULE_NAME = "group tree handler"; private static final String NAME_SPACE = "com:im:group"; private IQHandlerInfo info; public GroupTreeIQHander() { super(MODULE_NAME); info = new IQHandlerInfo("gruops", NAME_SPACE); } /* * (non-Javadoc) * * @see org.jivesoftware.openfire.handler.IQHandler#getInfo() */ @Override public IQHandlerInfo getInfo() { return info; } /* * (non-Javadoc) * * @see org.jivesoftware.openfire.handler.IQHandler#handleIQ(org.xmpp.packet.IQ) */ @Override public IQ handleIQ(IQ packet) throws UnauthorizedException { IQ reply = IQ.createResultIQ(packet); Element groups = packet.getChildElement();//1 if (!IQ.Type.get.equals(packet.getType())) { System.out.println("非法的请求类型"); reply.setChildElement(groups.createCopy()); reply.setError(PacketError.Condition.bad_request); return reply; } String userName = StringUtils.substringBefore(packet.getFrom().toString(),"@"); GroupManager.getInstance().initElement(groups,userName); reply.setChildElement(groups.createCopy());//2 System.out.println("返回的最终XML" + reply.toXML()); return reply; }}可以看到主要有两个方法,一个是getInfo() 这个方法的目的是提供要解析的命名空间,在本例中,这个IQHandler 对每个命名空间为"com:im:group" 的实例进行处理;还有一个最重要的方法:handleIQ() 该方法对包含指定命名空间的XML 进行解析,然后返回一个解析好的IQ。其实我认为,这个IQHandler 和IQ 的关系就是Controller 和Model 的关系(如果你了解MVC 的话,那么你一定知道我再说什么),只不过这里并没有指定什么View,你完全可以把IQ 当成Model 类进行理解。在这里,我用了GroupManager 进行了XML 的处理,因为我返回的IQ 内容中要从数据库读取所有群组信息,所以转交给GroupManager 进行处理,你完全可以在这个方法中进行具体的XML 处理,在这里,解析和创建新的XML 主要用到的是JDOM(如果你对Java 解析XML 有所了解,那真的太好了!)。程序//1 处主要是获取创建返回的IQ,并获取原来IQ 的子元素(用于创建我们返回的IQ);程序//2 处很关键,如果你不调用createCopy 方法,程序会出错(程序会死锁还是什么,忘记咧,不好以西)。
这就是程序的主体部分,我在这里有一个建议,能不用Openfire 原始的程序函数,就不要用它们。我的提取数据库方式都是自己写的Bean,这样有利于你自己对程序的掌控,其实更有利于快速开发(这世道不是啥都讲究敏捷么,哇哈哈)
3、打包插件
打包依然遵循二次打包的原则(如果你不了解啥叫要二次打包,请看上一篇)
这是我的ant 文件,由于Eclipse 帮我做了build 等很多工作,实际我的ant 工作就是在打包,并放入插件目录下的plugin 文件夹下
<?xml version="1.0" encoding="UTF-8"?><project name="IM" default="release" basedir="."> <property name="openfire.path" value="E:/workspace/europa/openfire_src/target/openfire" /> <property name="classes.dir" value="classes" /> <property name="lib.dir" value="lib" /> <target name="jar"> <jar jarfile="${lib.dir}/grouptreeplugin.jar" basedir="${classes.dir}" > <fileset dir="."> <include name="*.jar"/> </fileset> </jar> <jar jarfile="${openfire.path}/plugins/groupTreePlugin.jar"> <fileset dir="."> <include name="lib/*.jar" /> <include name="plugin.xml" /> <include name="logo_small.gif" /> <include name="logo_large.gif" /> <include name="readme.html" /> <include name="changelog.html" /> <include name="build.xml" /> </fileset> </jar> </target> <target name="release" depends="jar"> </target></project>好了,至此XMPP+Spark+Openfire 的插件开发三部曲彻底结束了,希望你们对这个开发流程有了系统的了解。
相关推荐
通过这个简单的demo,你可以学习到Openfire插件开发的基本流程和核心概念,为进一步深入开发奠定基础。 总的来说,Openfire插件开发涉及Java编程、XML配置、服务器端API的使用等多个方面,是一个综合性的技术实践。...
Openfire是一个基于XMPP协议的即时通讯服务器端实现,它具有基本的即时通讯功能,并提供了插件架构用于扩展新功能。Openfire服务器的核心通信处理依赖于Apache MINA框架。Apache MINA是一个高性能和高可靠性网络应用...
- 开发Openfire插件:Openfire的插件系统允许开发者创建新的功能模块,比如权限管理、审计日志、自定义认证机制等。 - 集成其他系统:Spark和Openfire可以与其他系统集成,例如CRM、ERP等,实现业务流程中的即时...
本开发文档主要介绍如何快速地开始Openfire插件的开发,并深入理解源码。 一、Openfire 源码部署与打包 1. 准备工作: 开发者需要安装MyEclipse 6.6作为集成开发环境(IDE),同时从官方网站...
开发Openfire插件时,你需要熟悉Java编程语言,了解XMPP协议,以及Openfire提供的API和文档。Openfire的插件体系结构允许开发者轻松地扩展服务器功能,比如实现新的用户认证方式、消息过滤、聊天记录存储或其他定制...
Openfire 安装配置和插件开发详解 Openfire 是一个基于 XMPP 协议的即时通信服务器,可以实现实时的聊天服务。在本文中,我们将详细介绍 Openfire 的安装和配置过程,并探讨如何使用 Eclipse 进行插件开发。 一、...
Openfire是一款开源的即时通讯(IM)服务器,它基于XMPP协议,允许用户进行实时通信和协作。在Openfire中,插件是扩展...随着经验的积累,你将能够开发出满足各种需求的Openfire插件,丰富和增强Openfire服务器的功能。
Openfire 是一款开源的即时通讯(Instant Messaging, IM)服务器,它基于XMPP(Extensible Messaging and Presence Protocol)协议,提供了高效且可扩展的实时通信平台。Openfire 的服务端主要由 Java 语言编写,...
综上所述,Openfire插件开发涵盖了一系列技术点,包括对XMPP协议的理解,Java编程技能,Maven项目管理,以及Openfire提供的各种API和工具。通过这些技术,开发者可以构建出强大的、定制化的即时通讯解决方案。
#### 六、Openfire插件开发指南 ##### 6.1 插件开发目的 - 提升服务器功能。 - 支持定制化需求。 ##### 6.2 开发流程 - **目录结构**:定义插件文件夹及文件组织方式。 - **配置文件**:`plugin.xml`用于配置...
在本文中,我们将讨论基于 Openfire 和 Spark 的 XMPP IM 软件开发。我们将从 XMPP 协议的介绍开始,接着讨论如何使用 Spark 和 Openfire 来实现一个完整的 IM 软件开发。 什么是 XMPP? XMPP(Extensible ...
Smack 是一个 XMPP 协议的 Java 实现,提供一套可扩展的 API,不过有些时候,你还是不得不使用自己定制发送的 XML 文件内容的方式来实现自己的功能。 Apache MINA 是一个网络应用程序框架,用来帮助用户简单地开发...
综上所述,XMPP协议及其服务器端的Openfire插件开发是构建现代即时通讯系统的重要组成部分,通过XML的灵活性和标准化的优势,它为开发者提供了强大的工具,以创建高度定制化且与各种平台兼容的通信解决方案。
Openfire插件是扩展其功能的关键,通过编写插件,开发者可以定制化自己的IM系统以满足特定需求。 在你提供的"openfire插件Demo"中,我们可以看到一个名为"SavePlugin"的压缩包子文件。这个"SavePlugin"很可能是一个...
在安装和管理Openfire插件时,用户可以通过Openfire的Web管理界面进行操作。在"Plugins"菜单下,可以浏览可用的插件、安装新插件、更新现有插件或禁用不需要的插件。Openfire社区提供了许多开源插件,也可以选择第三...
- 开发者可以利用Openfire的API和SDK开发自己的插件,进一步定制化服务器功能。 - 在企业环境中,Openfire插件包可以帮助整合内部通信系统,提高工作效率,减少沟通成本。 5. 性能优化: - 根据服务器硬件资源和...
在开发自己的XMPP IM时,我们可以使用插件扩展的方式来增加新的功能,而不是修改人家的源代码。这样可以使我们的项目架构变得更加灵活和可扩展。通过使用OpenFire、Spark和Smack三个组件,我们可以开发出一个完整的...
在你提供的文件列表中,每个.jar文件代表了一个特定的Openfire插件或服务组件。以下是对这些文件及其对应功能的详细解释: 1. **ofmeet.jar**:这个插件是Openfire的视频会议解决方案,名为"OfMeet"。它提供了基于...
Openfire是一款开源的即时通讯(IM)服务器,它基于XMPP协议,允许用户进行实时通信和协作。在Openfire中,消息记录存储插件扮演着关键角色,它负责收集、存储以及检索用户的聊天记录,这对于企业级通信管理和合规性...
开发Openfire插件或定制Openfire时,有几个重要的心得分享: - **深入理解XMPP协议**:无论是开发还是维护,对XMPP协议的深入了解都是至关重要的。 - **利用现有资源**:Openfire社区和文档提供了丰富的资源,充分...