文章源地址:http://blog.csdn.net/e_one/article/details/60336159,转载请注明出处


1.源码的配置

https://github.com/igniterealtime/Openfire/releases去下载openfire的源码,导入eclipse,openfire需要Ant工具进行编译,所以还要装上Ant。

2.插件目录结构

装好后,在eclipse的openfire源码目录的plugins目录下创建一个插件文件结构,文件结构见下图,注意图中圈起来的地方。RandomUser是我们要开发的插件目录。

3. plugin.xml文件的规则

plugin.xml文件是插件的描述文件,必不可少。在这个文件中定义了插件的一些信息。

我们来看一下plugins.xml文件的结构。

<?xml version="1.0"encoding="UTF-8"?>
 
<plugin>
<!-- 制定类-->
<class>com.woc.chat.plugin.MatchUser.MatchUserPlugin</class>
 
<!-- Plugin meta-data -->
<name>MatchUserPlugin</name>
<description>随机匹配聊天的插件.</description>
<author>zyw</author>
 
<version>1.0</version>
<date>20/01/2017</date>
<minServerVersion>3.4.1</minServerVersion>
<licenseType>gpl</licenseType>
 
<adminconsole>   
    </adminconsole>
</plugin>

这是一个标准的xml的文件。

pluagin标签:是文档的主标签

class标签:指明插件入口类所在位置,和上面的文件结构对应

name标签:指定插件的名称

description标签:插件的描述

author标签:插件的作者

version标签:插件的版本

date标签:插件的版本

minServerVersion标签:运行此插件需要的最低的openfire服务器的版本

 

4.插件周期的管理

周期指的是当插件被openfire服务器加载,或者被停止的时候。我们将将我们的MatchUserPlugin类实现Plugin接口,MatchUserPlugin类在plugin.xml里定义过它的路径,没错,就是它!

private final Logger Log =
   LoggerFactory.getLogger(MatchUserPlugin.class);
public class MatchUserPlugin  implements Plugin {
   @Override
   public void destroyPlugin() {
      // TODOAuto-generated method stub
      Log.info("------------------->MatchUserPlugindestroy!");
     
   }
 
   @Override
   public void initializePlugin(PluginManager pluginManager, Filefile) {
      // TODOAuto-generated method stub
      Log.info("------------------->MatchUserPlugininitialize!");
   }
}


initializePlugin函数是当插件被加载的时候被调用的函数,destroyPlugin是当插件被停止的时候被调用的函数。

注:在Openfire调用打印函数,openfire插件的打印的日志信息可以在操作后台查看。

5.处理经过服务器的数据包

数据包在Openfire中被称为IQ.现在我们看看怎么处理进入服务器的IQ包。

1. 往IQRouter里添加操作类。

try {
 
          IQRouter iqRouter  =XMPPServer.getInstance().getIQRouter();
          iqRouter.addHandler(new MyIQHandler("MyIQHandler")); 
 
      } catch (Exceptione) {
          // TODO: handle exception
          Log.info("------------------->BindException:"+e.toString());
      }

2. 编写MyIQHandler类,MyIQHandler类继承IQHandler类,在MyIQHandler类里的handleIQ函数里操作数据包。

private class MyIQHandler extends IQHandler{
      private IQHandlerInfoinfo;
      @Override
      public void initialize(XMPPServer server) {
          // TODO Auto-generated method stub
          super.initialize(server);
         
      }
      public MyIQHandler(StringmoduleName) {
          super(moduleName);
         // TODO Auto-generated constructor stub
          info=new IQHandlerInfo("info",NAMESPACE_INFO);
      }
      @Override
      public IQHandlerInfo getInfo() {
          // TODO Auto-generated method stub
          returninfo;
      }
 
      @Override
      public IQ handleIQ(IQpacket)throws UnauthorizedException {
          // TODO Auto-generated method stub
          String childName=packet.getChildElement().getName();
          IQ replyIQ=IQ.createResultIQ(packet);       
          returnreplyIQ;
      }
   }//MyIQHandler

handleIQ函数有一个函数,这个函数有一个参数,IQ类型的,IQ类在Openfire中是数据包的封装类,这个参数传进来的IQ是客户端发来的IQ,而方法返回的IQ是返回给客户端的IQ.

6.IQ包的结构

其实,要想直观的看到IQ的结构,直接调用toXML方法并打印出来就行了,IQ包的结构大概如下:

<iqtype="get"
 id="TeUQc-12"
 from="zyw8@localhost/Smack"
 to=" localhost/MatchUserPlugin "/>

type字段:iq包的类型,可以为set,get,result,error。

       set:set请求

       get:相当于http的get请求

result:服务端返回结果,在handleIQ函数里,可以通过

IQ replyIQ=createResultIQ(packet);

得到type为result的包。并加以修改,最后返回给客户端。

error:当请求为错误时。

id字段:包的id,由smack或者openfire生成

from字段:包的来源

to字段:包要发往的目的

7.编译Openfire源码

所有的工作完成后,我们就可以编译源码了

选中plugins右键,Run As->AntBuild

 

如果没问题,稍等片刻就可以编译完成,编译完成后就可以在{openfire源码目录}\target\openfire\plugins下找到我们的Jar包


把jar包放进{Openfire服务器安装目录}/plugins/下,服务器就会自动安装插件。插件运行成功,我们可以在控制台看到日志。


文章源地址:http://blog.csdn.net/e_one/article/details/60336159,转载请注明出处


Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐