您的位置:首页 > 运维架构

【openfire,smack使用总结】--openfire插件开发

2017-03-04 18:29 399 查看

文章源地址: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,转载请注明出处

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐