Openfire源代码分析
(运行环境的搭建)
关于Openfire的介绍在此不多说了,网上有很多关于这个基于Java的XMPP服务器的介绍,也可以通Jivesoftware的官方网站www.jivesofteware.com来寻找关于Openfire的信息。
如果研究Openfire的代码,建议第一步在本机上安装Openfire服务器和Spark这款XMPP的客户端程序,这样既可以熟悉一下Openfire的样态和功能,也可以在以后的源代码调试过程中通过Openfire的目录结构得到帮助.
准备工作:Eclipse环境(当然包括JavaSE),Openfire的源代码包(例如:openfire_src_3_3_2.tar.gz,可到jivesoftware官方网站下载),Mysql数据库V5以上(当然可以用其他数据库,但在此例中选用Mysql作为Openfire的后台数据库)。
第二步:将openfire_src_3_3_2.tar.gz解压后目录下除了Readme和License以外有四个子目录。
1. build目录:build目录下收录的是生成安装文件(例如:rpm)所要的一些文件,例如JRE等。
2. resources目录:resources目录下收录的是一些为实现国际化(i18n)和本地化的一些编码文件(例如:英文,中文,法文,德文等)。
3. documentation目录:documentation目录下收录的是一些关于Openfire安装和配置的信息,但最终要的是这里有Openfire开发的Javadoc。
4. src目录:顾名思义这个src文件夹就是我们想要的Openfire源代码了,这下面又有许多文件夹,我们只要Java文件夹就好,这里面实现的Openfire的核心功能,通过它就可以调试Openfire了。
第三步:在Eclipse中将此Java文件夹当成源代码文件夹新建工程,建立新工程后观察Openfire所import的包,发现Openfire用了许多开源工具,而这些库都在上文提到的Build目录的lib目录下(当然也可以到网上下载),将Openfire用到的库都添加到这个新建工程的Referenced Libraries中。或者如果这样一个一个添加比较麻烦的话还有一个方法就是从你安装好的Openfire服务器目录下的lib目录中(例如:”D:\Program Files\Openfire\lib”或 “/usr/local/openfire/lib”)找到openfire.jar,打开后将里面的org/jivesoftware删除,重新打包成jar并添加到这个新建工程的Referenced Libraries中,这样省去了很多工作。
第四步:openfire的起始类为org.jivesoftware.openfire.starter.ServerStarter.java 但是直接运行此类却有问题,因为此类是针对Openfire安装包而设计的,此类的功能是将所用到的Jar文件解压并将class文件加载到虚拟机中,而我们要用的却是源代码中我们自己编译好的class文件,所以我们需要一个新的启动类,一个简单的实现如下(当然最好是与ServerStarter.java中的方法一样,用自定义的ClassLoader来将XMPPServer.class加载到虚拟机中):
package org.jivesoftware.openfire.starter;
import org.jivesoftware.openfire.XMPPServer;
public class StandaloneStarter {
public static void main(String[] args) {
XMPPServer server = new XMPPServer();
}
}
这样程序就可以跑起来了,最后的问题就是配置文件路径的问题,但我在此不想多少,留给访友调试解决了。
客户端连接)
Openfire的socket网络连接包括:
1. 服务器和服务器之间的连接(监听在端口5269)
2. 外部组件和服务器之间的连接(监听在端口5275)
3. 多元(complex)连接(监听在端口5269)
4. 客户端和服务器的连接(监听在端口5222)
5. 和客户端通过TLS/SSL3.0和服务器的连接。(监听在端口5223)
这些连接都是通过ConnectionManager接口实现管理的,程序中对ConnectionManager接口的实现类是ConnectionManagerImpl,它是作为一个模块(Module)类加载到服务器中的。
下面分析的是客户端和服务器的连接。
在ConnectionManagerImpl中是通过调用startClientListeners方法来初始化和开始端口监听的。
在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服务器、Telnet服务器等等。
要实现自己的编码/解码器(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的解码器类)使用的,再创建一个Openfire的Connection类实例connection和一个StanzaHandler的实例。最后将以上的parser, connection和StanzaHandler的实例存放在Mina的session中,以便以后使用。
当有数据发送过来时,Mina框架会调用messageReceived方法
messageReceived首先从Mina的session中得到在sessionOpened方法中创建的StanzaHandler实例handler,然后从parsers中得到一个parser(如果parsers中没有可以创建一个新的实例)(注意这个parser和在sessionOpened方法中创建的parser不同,这个parser是用来处理Stanza的,而在sessionOpened方法中创建的parser是在filter中用来解码的,一句话说就是在sessionOpened方法中创建的parser是更低一层的parser)。最后将xml数据包交给StanzaHander的实例hander进行处理。
StanzaHander的实例hander处理xml数据包的过程
StanzaHander首先判断xml数据包的类型,.如果数据包以“<stream:stream”打头那么说明客户端刚刚连接,需要初始化通信(符合XMPP协议)Openfire首先为此客户端建立一个与客户端JID相关的ClientSession,而后与客户端交互协商例如是否使用SSL,是否使用压缩等问题。当协商完成之后进入正常通信阶段,则可以将xml数据包交给这个用户的ClientSession进行派送(deliever),经过派送数据包可以发送给PacketRouteImpl模块进行处理。
在PacketRouteImpl中包将进一步被细化处理,以后将继续分析。
相关推荐
### Openfire源代码研究 #### 一、Openfire源代码目录结构分析 ##### 1. build目录 - **概述**:此目录包含了构建Openfire安装文件所需的资源与配置,例如生成RPM包或其他类型的安装程序时所必需的脚本与文件。 -...
### Openfire 源代码在 Eclipse 3.5.2 中的部署、编译、运行与安装 #### 一、准备工作 在开始之前,需要确保已经下载了 Openfire(版本 3.6.4)、Spark(版本 2.5.8)以及 Smack(版本 3.1.0)。由于 Spark 的源码...
本文将详细介绍如何在Eclipse开发环境中部署Openfire源代码。Openfire是一款基于XMPP协议的即时消息服务器,由Ignite Realtime组织开发并维护。由于其开源、灵活且支持多种设备的特点,在企业级即时通信系统中有广泛...
《Openfire源代码在Eclipse3.5.2中的部署、编译与运行》 Openfire是一款基于Java的开源即时通讯服务器,它提供了强大的聊天、会议和协作功能。本教程将指导你如何在Eclipse 3.5.2环境下部署、编译、运行并配置...
2. **源码下载**: 访问官方网站 [http://www.igniterealtime.org/projects/openfire/](http://www.igniterealtime.org/projects/openfire/) 下载最新版本的Openfire源代码,文档中提到的是3.6.4版本。 #### 三、...
综上所述,Openfire源码的学习和研究可以帮助开发者深入了解即时通讯系统的实现,掌握XMPP协议的运用,以及Java服务器端编程技巧。对于想要构建自己的IM系统或者对实时通信感兴趣的开发者来说,Openfire是一个极好的...
### Openfire源码分析 #### 一、Openfire概述 **Openfire**是一款基于XMPP协议的开源实时通信服务器,XMPP(可扩展消息处理协议)又称为Jabber协议,是一种开放标准的即时通讯协议。Openfire的核心功能主要包括...
### Openfire源码部署开发详解 #### 一、Openfire简介 Openfire是一款开源的即时通讯服务器,基于XMPP协议栈。它支持多种客户端,并且能够处理大量的并发连接。Openfire以其灵活性、可扩展性和易用性而受到广泛欢迎...
### Openfire源码部署与开发知识点详解 #### 一、Openfire简介 Openfire是一款开源的即时消息服务器,基于XMPP协议(可扩展消息处理协议),由Ignite Realtime开发和维护。它提供了丰富的功能,包括群聊、文件传输...
4. **下载Openfire源码和安装程序**:从IgniteRealtime官方网站下载Openfire的安装程序和源代码。 5. **导入Openfire源文件到Eclipse**:将解压后的`openfire_src`文件夹复制到Eclipse的工作空间,然后在Eclipse中...
1. `src`目录:这是Openfire源代码的主要部分,包含了服务器的各个组件和模块。例如,`admin`目录包含管理控制台的源码,`provider`目录则包含了各种数据存储提供者,如JDBC、LDAP等。 2. `plugins`目录:这里包含...
Openfire是一款开源的即时通讯(IM)服务器,它基于XMPP协议,用于构建实时通信系统。...当发现Openfire源码缺少bouncycastle.jar包时,及时添加相应版本的库可以解决相关问题,确保系统的稳定性和安全性。
本文将详细介绍如何在Eclipse环境下,对Openfire 3.7.1的源代码进行部署和运行,帮助开发者深入理解其内部机制。 首先,我们需要准备以下环境和资源: 1. Eclipse IDE,确保已经安装了JDK,因为Openfire是用Java...
将openfire_src_3_7_0.zip解压缩到Eclipse的workspace,重命名为openfire,创建一个新的Java项目,名称为openfire,然后将openfire源代码导入到Eclipse中。 三、 编译Openfire源代码 使用Ant编译Openfire源代码,...
Openfire源码 缺失的jar包- jetty-jmx-8.0.0.M2.jar 。还有其他jar包请查看
《Openfire 4.5.0源码解析:探索即时通讯框架的秘密》 Openfire,一个基于XMPP(Extensible Messaging and Presence Protocol)协议的开源即时通讯框架,因其高效、可扩展性和安全性,在IT领域备受青睐。4.5.0版本...
openfire源码搭建所需要的5个包。pull-parser-2.1.10.jar、apache-ant-1.8.2.jar、coherence.jar、coherence-work.jar、tangosol.jar