到https://github.com/igniterealtime/Openfire/releases去下载openfire的源码,导入eclipse,openfire需要Ant工具进行编译,所以还要装上Ant。
装好后,在eclipse的openfire源码目录的plugins目录下创建一个插件文件结构,文件结构见下图,注意图中圈起来的地方。RandomUser是我们要开发的插件目录。
plugin.xml文件是插件的描述文件,必不可少。在这个文件中定义了插件的一些信息。
我们来看一下plugins.xml文件的结构。
com.woc.chat.plugin.MatchUser.MatchUserPlugin
MatchUserPlugin
随机匹配聊天的插件.
zyw
1.0
20/01/2017
3.4.1
gpl
这是一个标准的xml的文件。
pluagin标签:是文档的主标签
class标签:指明插件入口类所在位置,和上面的文件结构对应
name标签:指定插件的名称
description标签:插件的描述
author标签:插件的作者
version标签:插件的版本
date标签:插件的版本
minServerVersion标签:运行此插件需要的最低的openfire服务器的版本
周期指的是当插件被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插件的打印的日志信息可以在操作后台查看。
数据包在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.
其实,要想直观的看到IQ的结构,直接调用toXML方法并打印出来就行了,IQ包的结构大概如下:
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字段:包要发往的目的
所有的工作完成后,我们就可以编译源码了
选中plugins右键,Run As->AntBuild
如果没问题,稍等片刻就可以编译完成,编译完成后就可以在{openfire源码目录}\target\openfire\plugins下找到我们的Jar包
把jar包放进{Openfire服务器安装目录}/plugins/下,服务器就会自动安装插件。插件运行成功,我们可以在控制台看到日志。