Openfire最主要的功能是实现XMPP服务器,简单来说,openfire为我们提供一个固定的地址,我们只需要向openfire服务器发送标准的XMPP信息(即XML文件流),那么openfire服务器应当给予我们回应,这里的openfire服务器也可以看做一个容器,我们在聊天时,需要在这个服务器上注册一个会话,在会话存在的时间,我们可以实现即时聊天的一些常用功能,比如建立自己的组,添加好友,聊天,以及传送文件等等,同时,openfire服务器实现自己的管理界面,这样openfire服务器也扮演一个web容器的角色。
Openfire的核心功能可以概括为:连接管理、消息解析、消息路由、消息发送。
Openfire使用JSP+JavaBean技术实现管理页面的开发。Web服务器采用内置的jetty作web服务器,在启动AdminConsolePlugin插件时调用startup()方法启动jetty服务器,9090为其普通端口,9091为其加密端口。
Openfire源码目录结构。
1) build目录:build目录下收录的是生成安装文件(例如:rpm)所要的一些文件,例如JRE等
2) resources目录:resources目录下收录的是一些为实现国际化(i18n)和本地化的一些编码文件。
3) documentation目录:documentation目录下收录的是一些关于Openfire安装和配置的信息。
4) src目录: src文件夹就是我们想要的Openfire源代码。
Openfire中常见的类名后缀命名包括Starter、Plugin、Listener、Dispatcher、Handler、Manager、Provider,通常情况下,这些命名类包括如下意义:
XXStarter
系统启动类,如org.jivesoftware.openfire.starter.ServerStarter,调用其start()方法可启动系统应用。
XXListener
业务的最终处理类。
XXDispatcher
调度类,其中有很多关键方法,如addListener(),以组合的方式,为类内定义的静态Set
XXPlugin
实现Plugin接口的插件类,需实现initializePlugin(PluginManagermanager, File pluginDirectory)方法和destroyPlugin()方法。在其初始化方法中调用Dispatcher实现类的addListener()方法如PropertyEventDispatcher.addListener(this)。
XXProvider
实现面向接口编程方式的接口类,通过反射机制创建具体实现类的对象,反射类名配置在ofproperty表对应的记录propvalue属性中。若没有相关配置,则调用默认实现类,默认实现类类名命名规则为DefaultXXProvider。
XXHandler
实际处理类
Openfire的系统配置项采用文件结合数据库表的方式配置,Openfire中比较重要的配置位置包括:
一、 src/conf目录下的openfire.xml配置文件。该配置文件为系统核心配置文件。在第一次启动Openfire并通过管理控制台完成安装配置后会往该配置文件中填入相应的配置信息。
二、 plugin.xml配置文件。该配置文件为各插件包下的核心配置文件,由它确定插件核心处理类和相应页面插件的展现等。配置项及含义详见官方插件开发说明部分。
三、 web.xml和web-custom.xml配置文件。用于配置servlet和用户自定义servlet(插件页面用,放在插件对应目录下)。
四、 ofproperty表中的各条记录,该表中包括两个字段name和propvalue,分别代表配置项名和配置项值。
Openfire的数据库处理采用直接调用JDBC 的方式。核心类为DbConnectionManager。数据库的处理与业务处理耦合,没有划分出专门的业务逻辑层。 ConnectionProvider,此类为数据库提供者接口,如需连接mysql、pg等数据库,需首先实现些接口,通常直接调用XXManager中的实例方法,XXManager中又调用的是对应的接口XXProvider的方法,实际操作在该接口的实现类中实现。实现类是动态绑定的(默认的实现类通常命名规则为DefaultXXProvider),在运行时根据ofproperty表中对应配置项值选。
org.jivesoftware.database.DbConnectionManager,连接管理类。
org.jivesoftware.util.JiveGlobals,通常用于操作ofproperty表中记录。
XMPP协议是基于TCP/IP协议进行传输的,在openfire中,应用了apache的mina框架作为NIO框架,简单的来说,openfire服务器用mina框架建立一个简单的服务器,可以接收和发送基本的IO流,然后在此基础上把接收到的IO流解析为XML文件,然后在根据XMPP协议对XML文件进行操作。
核心的XML流传输协议 ,基于XML FreeEIM流传输的即时通讯扩展应用,XMPP的扩展协议Jingle使得其支持语音和视频。
XMPP协议在PC和Android分别有对应的协议实现smack和asmack,不用我们写XML协议解析。
xxxS
XMPP协议Android分别有对应的协议实现smack和asmack,不用我们写XML协议解析,Smack是一个开源,易于使用的XMPP(jabber)客户端类库。Smack 是一个XMPP 协议的Java 实现,提供一套可扩展的API。非常简单易用,并且有十分强大的API,只需短短几行代码就可以向用户发送文本消息。
Openfire服务器端支持插件开发,如果开发者需要添加新的服务,可以开发出自己的插件后,安装至服务器,就可以提供服务,如查找联系人服务就是以插件的形式提供的。插件位置在openfire_src\src\plugins下,每一个插件占一个目录。
Openfire自带的核心插件主要包括:
Broadcast广播消息插件,主要是将用户在群组内发的消息转发群组内的其他成员,开发群组功能会用到。
Client Control 允许那些客户端连接openfire以及使用那些功能。
Registration用户注册插件。
Search用户查找插件。
Clustering Plugin服务器集群插件。
Content Filter客户端聊天信息非法内容过滤。如果收到非法字符,将截取并返回一个标准提示。
用户信息等用电子名片Vcard是以xml的格式存储的,openfire的电子名片是使用DefaultVCardProvider类来实现的,格式如下所示: