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 的解码器类)使用的,再。xmpp协议及其服务器端的openfire插件开发
相关推荐
方法,则可在很大程度上降低或减缓生病的机率,防治 DDOS 攻击也是如此,拥有充足的带宽和配置足够高的主机硬件是必需的,那么什么算是充足的带宽呢。 一般来说至少应该是 100M 共享,那么什么算配置足够高的 主机硬件呢。 一般来说至少应该是 P4 的 CPU、 512M 内存和 Intel 等品牌网卡。 拥有此配置的带宽和主机理论上可应对每秒 20万以上的 SYN 攻击
ws XP操作系统的默认设置是在系统启动时便调用该程序。 但如果你并不习惯使用该程序,可以通过删除HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\MSMSGS此 键来实现。 3在关机对话框中显示“休眠” Windows XP 的默认设置是在关机对话框中没有让系统进入休眠状态的选项,而显示该选项的操作非常简单
选择 (113),滤波深度越大,稳定性越好,但响应速度也越慢。 按【9】显示滤波深度 :“H 5”,其中“H”表示是滤波深度,若不修改直接按【日期】,否则输入新值 (113)后按【日期】。 对电子汽车衡 ,推荐的滤波深度为“ 5” , 即可确保任何机动车称量时不熄火仍稳定显示。 按【车号】 ,显示器显示当前打印格式:“ Pr 11” 其中十位数表示是否打印中文货名: 0:打印中文货名 1
7 审核系统事件 成功 失败 8 审核帐户登录事件 成功 失败 9 审核帐户管理 成功 失败 方法: 控制面板-》管理工具-》 本地安全策略-》本地策略 第 4 页 共 13 页 3 服务 关闭不必须的服务 序号 服务 设置 说明 1 Alerter 手动 提供管理性的警告功能,通过 NetSend命令 2 Application Management 手动 提供软件安装服务,诸如分派
采取完全加密传输,包括数据传输,用户认证等,确保通信的保密性; 说明:备份可信端程序用于网站内容发布及更新,程序与 监控客户端( Monitor Client)一样,根据策略进行角色定义。 WebGuard 网页防篡改保护系统 技术白皮书 169。 2020 智恒科技 5 密级:公开 系统功能特点 所有的 Web网站都需要进行页面内容的保护, 防止非授权人员随意篡改内容,对于一些更新快、容量大
的用 户帐户。 不能删除 Administrator 帐户和 Guest 帐户。 重命名本地用户帐户 打开“ 服务器管理器 ”。 在控制台树中,单击“用户”。 右键单击要重命名的用户帐户,然后单击“重命名”。 键入新的用户名,然后按 Enter。 其他注意事项 若要执行此过程,必须提供本地计算机上 Administrator 帐户的凭据(如果提示),或必须是本地计算机上