ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:357.32KB ,
资源ID:30539950      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30539950.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(OpenFire二次开发环境搭建.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

OpenFire二次开发环境搭建.docx

1、OpenFire二次开发环境搭建1、导入项目2、ANT运行配置3、部署项目4、启动服务器5、访问服务器6、代码研究Openfire的socket网络连接包括:1.服务器和服务器之间的连接(监听在端口5269)2.外部组件和服务器之间的连接(监听在端口5275)3.多元(complex)连接(监听在端口5269)4.客户端和服务器的连接(监听在端口5222)5.客户端和服务器通过TLS/SSL3.0的连接。(监听在端口5223)客户端和服务器的连接分析:A、这些连接都是通过ConnectionManager接口实现管理的,程序中对ConnectionManager接口的实现类是org.jives

2、oftware.openfire.spi.ConnectionManagerImpl,它是作为一个模块(Module)类加载到服务器中的。在ConnectionManagerImpl中是通过调用startClientListeners方法来初始化和开始端口监听的。startClientListeners方法使用的是Apache的Mina框架来实现网络连接的,Mina框架的模式如下:几个接口:IoAccepter 相当于网络应用程序中的服务器端IoConnector 相当于客户端IoSession 当前客户端到服务器端的一个连接实例IoHandler 业务处理逻辑IoFilter 过滤器用于连接

3、通讯层接口与业务层接口IoFilter:IoFilter为MINA的功能扩展提供了接口。它拦截所有的IO事件进行事件的预处理和后处理。它与Servlet中的filter机制十分相似。多个IoFilter存放在IoFilterChain中IoFilter能够实现以下功能:数据转换事件日志性能检测在Openfire中主要用filter这种机制来进行数据转换。B、Protocol Codec Factory:Protocol Codec Factory提供了方便的Protocol支持,通过它的Encoder和Decoder,可以方便的扩展并支持各种基于Socket的网络协议,比如HTTP服务器、FT

4、P服务器、Telnet服务器等等。要实现自己的编码/解码器(codec)只需要实现interface: ProtocolCodecFactory即可,在Openfire中实现ProtocolCodecFactory的类为org.jivesoftware.openfire.nio.XMPPCodecFactory。IoHandler:MINA中,所有的业务逻辑都有实现了IoHandler的class完成 ,当事件发生时,将触发IoHandler中的方法:sessionCreatedsessionOpenedsessionClosedsessionIdleexceptionCaughtmessag

5、eReceivedmessageSentC、在Openfire中客户端和服务器连接的IoHandler实现类是org.jivesoftware.openfire.nio.ClientConnectionHandler,它是从ConnectionHandler中继承来的。D、startClientListeners方法首先为Mina框架设置线程池,再将一个由XMPPCodecFactory作为Protocol Codec Factory的Filter放入到FilterChain中,然后绑定到端口5222,并将ClientConnectionHandler作为IoHandler对数据进行处理。完成

6、这些步骤后Openfire就在5222等待客户端的连接。E、客户端连接的处理过程:当有客户端进行连接时根据Mina框架的模式首先调用的是sessionOpened方法。sessionOpened首先为此新连接构造了一个parser(XMLLightWeightParser),这个parser是专门给XMPPDecoder(是XMPPCodecFactory的解码器类)使用的,再创建一个Openfire的Connection类实例connection和一个StanzaHandler的实例。最后将以上的parser, connection和StanzaHandler的实例存放在Mina的sessi

7、on中,以便以后使用。当有数据发送过来时,Mina框架会调用messageReceived方法。messageReceived首先从Mina的session中得到在sessionOpened方法中创建的StanzaHandler实例handler,然后从parsers中得到一个parser(如果parsers中没有可以创建一个新的实例)(注意这个parser和在sessionOpened方法中创建的parser不同,这个parser是用来处理Stanza的,而在sessionOpened方法中创建的parser是在filter中用来解码的,一句话说就是在sessionOpened方法中创建的p

8、arser是更低一层的parser)。最后将xml数据包交给StanzaHander的实例hander进行处理。F、StanzaHander的实例hander处理xml数据包的过程StanzaHander首先判断xml数据包的类型,如果数据包以“stream:stream”打头那么说明客户端刚刚连接,需要初始化通信(符合XMPP协议)Openfire首先为此客户端建立一个与客户端JID相关的ClientSession,而后与客户端交互协商例如是否使用SSL,是否使用压缩等问题。当协商完成之后进入正常通信阶段,则可以将xml数据包交给这个用户的ClientSession进行派送(deliever

9、),经过派送数据包可以发送给PacketRouteImpl模块进行处理。7、功能扩展A、修改源代码用户的创建。由于源代码中用户信息不能满足要求,需要扩展。服务器端创建用户比较简单,主要是客户端的创建比较复杂,主要有4个步骤,客户端发送创建用户的请求(get请求),请求创建的用户字段,服务器端接收到之后进行过滤,然后返回信息(result),信息中只包含合法的用户属性,客户端收到之后,再将合法的用户字段发送给服务器(set请求),服务器再根据收到的用户字段创建用户,即写入数据库。用户的查询。过程类似上面用户的创建。B、插件开发Openfire 服务器端是支持插件开发的,开发过程可能会涉及到数据库

10、的操作,本篇文章专注于Openfire 插件的部分,对服务器端涉及到数据库的开发只做简单介绍。Openfire 是一个用Java 实现的XMPP 服务器,客户端可以通过IQ 的方式与其进行通信(其实就是XML),客户端和服务器之间的通信是依靠底层Smack 库提供的各种功能来完成的。其实利用插件方式来扩展Openfire 服务器端主要有两种扩展方式,一种是对服务器控制台页面进行扩展(不是本文的主要内容),其实就是遵循Openfire 页面的布局方式,进行相应的页面扩展和功能扩展;另一种是对通信功能进行扩展。本文主要针对后者进行具体的描述本篇文章的结构如下:1、创建plugin.xml(这是整个

11、插件最关键的文档)2、创建服务器插件实例(实现Plugin 接口的一个类还有一批IQHandler)3、打包插件(Openfire 插件也有自己的打包方式)和部署插件好滴,实刀实枪的来动手做吧1、创建plugin.xml初次开发Openfire 和Spark 插件的时候,很容易把二者搞混,千万记得,这里是Openfire 的plugin.xml 不是第二篇文章说的那个啦!com.im.server.plugin.GroupTreePluginGroupTreePluginThis is the group plugin.Phoenix1.014/03/2008http:/localhost:9

12、001/openfire/plugins.jsp3.4.1gpl最重要的那一行我已经标记出来啦,就是你这个插件的初始化和垃圾清理类,例子中是在com.im.server.plugin 包中的GroupTreePlugin 类,下文会对这个类进行详细描述。其余的都是描述信息,只要你提供了正确的描述信息,一般都不会出错。建议初次开发者,在写完plugin.xml 文件后,写一个简单的Plugin 实例,并打印出一些信息,如果重新启动Openfire 信息成功显示,恭喜你,你已经迈出一大步了!2、实现Plugin 类和IQHandlerPlugin 类主要起到的作用是初始化和释放资源,在初始化的过程

13、中,最重要的的注册一批IQHandler,IQHander 的作用有点类似于Spark 中的IQProvider,其实就是解析XML 文件之后,生成一些有用的实例,以供处理。下面分别给出一个Plugin 类的实例和IQProvider 的实例GroupTreePlugin 类/* 服务器端插件类* * author Phoenix* * Mar 14, 2008 11:03:11 AM* * version 0.1*/public class GroupTreePlugin implements Pluginprivate XMPPServer server;/* (non-Javadoc)*

14、 * see org.jivesoftware.openfire.container.Plugin#destroyPlugin()*/public void destroyPlugin()/* (non-Javadoc)* * see org.jivesoftware.openfire.container.Plugin#initializePlugin(org.jivesoftware.openfire.container.PluginManager,* java.io.File)*/public void initializePlugin(PluginManager manager, Fil

15、e pluginDirectory)PluginLog.trace(注册群组树IQ处理器);server = XMPPServer.getInstance();server.getIQRouter().addHandler(new GroupTreeIQHander(); /1server.getIQRouter().addHandler(new UserInfoIQHandler();server.getIQRouter().addHandler(new DelUserIQHandler();server.getIQRouter().addHandler(new CreateUserIQHa

16、ndler();server.getIQRouter().addHandler(new AddGroupUserIQHandler();server.getIQRouter().addHandler(new SetRoleIQHandler();上例所示,在初始化中先找到IQRouter,然后通过IQRouter 注册一批IQHandler,这些IQHander 会自动监听相应命名空间的IQ,然后进行处理;由于这个Plugin 不需要做资源释放的工作,所以在destroyPlugin() 方法中没有任何内容。具体的IQHander 类如下GroupTreeIQHander/* 处理客户端发来的

17、IQ,并回送结果IQ* * author Phoenix* * Mar 14, 2008 4:55:33 PM* * version 0.1*/public class GroupTreeIQHander extends IQHandlerprivate static final String MODULE_NAME = group tree handler;private static final String NAME_SPACE = com:im:group;private IQHandlerInfo info;public GroupTreeIQHander()super(MODULE

18、_NAME);info = new IQHandlerInfo(gruops, NAME_SPACE);/* (non-Javadoc)* * see org.jivesoftware.openfire.handler.IQHandler#getInfo()*/Overridepublic IQHandlerInfo getInfo()return info;/* (non-Javadoc)* * see org.jivesoftware.openfire.handler.IQHandler#handleIQ(org.xmpp.packet.IQ)*/Overridepublic IQ han

19、dleIQ(IQ packet) throws UnauthorizedExceptionIQ reply = IQ.createResultIQ(packet);Element groups = packet.getChildElement();/1if (!IQ.Type.get.equals(packet.getType()System.out.println(非法的请求类型);reply.setChildElement(groups.createCopy();reply.setError(PacketError.Condition.bad_request);return reply;S

20、tring userName = StringUtils.substringBefore(packet.getFrom().toString(),);GroupManager.getInstance().initElement(groups,userName);reply.setChildElement(groups.createCopy();/2System.out.println(返回的最终XML + reply.toXML();return reply;可以看到主要有两个方法,一个是getInfo() 这个方法的目的是提供要解析的命名空间,在本例中,这个IQHandler 对每个命名空间

21、为com:im:group 的实例进行处理;还有一个最重要的方法:handleIQ() 该方法对包含指定命名空间的XML 进行解析,然后返回一个解析好的IQ。其实我认为,这个IQHandler 和IQ 的关系就是Controller 和Model 的关系(如果你了解MVC 的话,那么你一定知道我再说什么),只不过这里并没有指定什么View,你完全可以把IQ 当成Model 类进行理解。在这里,我用了GroupManager 进行了XML 的处理,因为我返回的IQ 内容中要从数据库读取所有群组信息,所以转交给GroupManager 进行处理,你完全可以在这个方法中进行具体的XML 处理,在这里

22、,解析和创建新的XML 主要用到的是JDOM(如果你对Java 解析XML 有所了解,那真的太好了!)。程序/1 处主要是获取创建返回的IQ,并获取原来IQ 的子元素(用于创建我们返回的IQ);程序/2 处很关键,如果你不调用createCopy 方法,程序会出错(程序会死锁还是什么,忘记咧,不好以西)。这就是程序的主体部分,我在这里有一个建议,能不用Openfire 原始的程序函数,就不要用它们。我的提取数据库方式都是自己写的Bean,这样有利于你自己对程序的掌控,其实更有利于快速开发(这世道不是啥都讲究敏捷么,哇哈哈)3、打包插件打包依然遵循二次打包的原则(如果你不了解啥叫要二次打包,请看上一篇)这是我的ant 文件,由于Eclipse 帮我做了build 等很多工作,实际我的ant 工作就是在打包,并放入插件目录下的plugin 文件夹下

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1