xmpp协议及其服务器端的openfire插件开发内容摘要:

version */ public class GroupTreePlugin implements Plugin { private XMPPServer server。 /* * (nonJavadoc) * * @see destroyPlugin() */ public void destroyPlugin() { } /* * (nonJavadoc) * * @see initializePlugin(ginManager, * ) */ public void initializePlugin(PluginManager manager, File pluginDirectory) { (注册群组树 IQ 处理器 )。 server = ()。 ().addHandler(new GroupTreeIQHander())。 //1 ().addHandler(new UserInfoIQHandler())。 ().addHandler(new DelUserIQHandler())。 ().addHandler(new CreateUserIQHandler())。 ().addHandler(new AddGroupUserIQHandler())。 ().addHandler(new SetRoleIQHandler())。 } } 上例所示,在初始化中先找到 IQRouter,然后通过 IQRouter 注册一批 IQHandler,这些IQHander 会自动监听相应命名空间的 IQ,然后进行处理;由于这个 Plugin 不需要做资源释放的工作,所以在 destroyPlugin() 方法中没有任何内容。 具体的 IQHander 类如下 GroupTreeIQHander /** * 处理客户端发来的 IQ,并回送结果 IQ * * @author Phoenix * * Mar 14, 2020 4:55:33 PM * * version */ public class GroupTreeIQHander extends IQHandler { private static final String MODULE_NAME = group tree handler。 private static final String NAME_SPACE = :im:group。 private IQHandlerInfo info。 public GroupTreeIQHander() { super(MODULE_NAME)。 info = new IQHandlerInfo(gruops, NAME_SPACE)。 } /* * (nonJavadoc) * * @see getInfo() */ @Override public IQHandlerInfo getInfo() { return info。 } /* * (nonJavadoc) * * @see handleIQ() */ @Override public IQ handleIQ(IQ packet) throws UnauthorizedException { IQ reply = (packet)。 Element groups = ()。 //1 if (!(())) { (非法的请求类型 )。 (())。 ()。 return reply。 } String userName = (().toString(),@)。 ().initElement(groups,userName)。 (())。 //2 (返回的最终 XML ())。 return reply。 } } 可以看到主要有两个方法,一个是 getInfo() 这个方法的目的是提供要解析的命名空间,在本例中,这个 IQHandler 对每个命名空间为 :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,这样有利于你自己对程序的掌控,其实更有利 于快速开发(这世道不是啥都讲究敏捷么,哇哈哈) 打包插件 打包依然遵循二次打包的原则(如果你不了解啥叫要二次打包,请看上一篇) 这是我的 ant 文件,由于 Eclipse 帮我做了 build 等很多工作,实际我的 ant 工作就是在打包,并放入插件目录下的 plugin 文件夹下 ?xml version= encoding=UTF8? project name=IM default=release basedir=. property name= value=E:/workspace/europa/openfire_src/target/openfire / property name= value=classes / property name= value=lib / target name=jar jar jarfile=${}/ basedir=${} fileset dir=. include name=*.jar/ /fileset /jar jar jarfile=${}/plugins/ fileset dir=. include name=lib/*.jar / include name= / include name= / include name= / include name= / include name= / include name= / /fileset /jar /target target name=release depends=jar /target /project 好了,至此 XMPP Spark Openfire 的插件开发三部曲彻底结束了,希望你们对这个开发流程有了系统的了 解。 第三章:代码研究 Openfire 的 socket 网络连接包括: ![if !supportLists]1. ![endif]服务器和服务器之间的连接(监听在端口 5269) ![if !supportLists]2. ![endif]外部组件和服务器之间的连接(监听在端口 5275) ![if !supportLists]3. ![endif]多元 (plex)连接(监听在端口 5269) ![if !supportLists]4. ![endif]客户端和服务器的连接(监听在端口 5222) ![if !supportLists]5. ![endif]和客户端通过 TLS/ 和服务器的连接。 (监听在端口 5223) 这些连接都是通过 ConnectionManager 接口实现管理的,程序中对 ConnectionManager接口的实现类是 ConnectionManagerImpl,它是作为一个模块( Module)类加载到服务器中的。 下面分析的是客户端和服务器的连接。 在 ConnectionManagerImpl中是通过调用 startClientListeners方法来初始化和开始端口监听的。 ![endif]在 startClientListeners方法使用的是 Apache的 Mina框架来实现网络连接的, Mina 框架的模式如下: IoFilter: IoFilter 为 MINA的功能扩展提供了接口。 它拦截所有的 IO 事件进行事件的预处理和后处理。 它与 Servlet 中的 filter 机制十分相似。 多个 IoFilter 存放在 IoFilterChain 中 IoFilter 能够实现以下功能: 数据转换 事件日志 性能检测 在 Openfire 中主要用 filter 这种机制来进行数据转换。 Protocol Codec Factory: Protocol Codec Factory 提供了方便的 Protocol 支持,通过它的 Encoder 和 Decoder,可以方便的扩展并支持各种基于 Socket 的网络协议,比如 HTTP 服务器、 FTP 服务器、 Tel 服务器等等。 要实现自己的编码 /解码器 (codec)只需要实现 interface: ProtocolCodecFactory 即可,在 Openfire 中实现 ProtocolCodecFactory 的类为 XMPPCodecFactory。 IoHandler: MINA 中,所有的业务逻辑都有实现了 IoHandler 的 class 完成 ,当事件发生时,将触发 IoHandler 中的方法 : sessionCreated sessionOpened sessionClosed sessionIdle exceptionCaught messageReceived messageSent 在 Openfire 中客户端和服务器连接的 IoHandler 实现类是 ClientConnectionHandler,它是从 ConnectionHandler 中继承来的。 startClientListeners 方法首先为 Mian 框架设置线程池,再将一个由 XMPPCodecFactory 作为 Protocol Codec Factory 的 Filter 放入到 FilterChain 中,然后绑定到端口 5222,并将 ClientConnectionHandler 作为 IoHandler 对数据进行处理。 完成这些步骤后 Openfire 就在 5222 等待客户端的连接。 客户端连接的处理过程: 当有客户端进行连接时根据 Mina 框架的模式首先调用的是 sessionOpened 方法。 sessionOpened 首先为此新连接构造了一个 parser( XMLLightWeightParser),这个 parser 是专门给 XMPPDecoder(是 XMPPCodecFactory 的解码器类)使用的,再。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。