前面学习了openfire服务器启动的过程,那么启动之后服务器是以怎样的形式完成它的功能呢?先放开大体框架方面的东西和其他各方面的功能实现,从单纯的客户端要出请求注册或登录这个流程看起,逐步摸索。
从服务器与客户端进行信息交换的视角来看,服务器必然是要监听一些端口,来接收客户端的信息的。在启动流程加载的依托module中,有个叫ConnectionManagerImpl 的,这厮在所有模块中最后一个被加载,老外给的原因是对客户端监听的加载要放到其他所有模块加载完之后,一些功能支持性的模块要先加载完,合情合理。既然是加载 module,那么必然是执行了module 的start 方法:
@Override
public void start() {
super.start();
//创建各路监听器
createListeners();
//开启各路监听器
startListeners();
//追踪soket状态开启
SocketSendingTracker.getInstance().start();
//注册接收事件
CertificateManager.addListener(this);
}
从创建开始,这货都建立了哪些监听器:
private synchronized void createListeners() {
if (isSocketStarted || sessionManager == null || deliverer == null || router == null || serverName == null) {
return;
}
// Create the port listener for s2s communication
//服务器间信息交流的
createServerListener(localIPAddress);
// Create the port listener for Connections Multiplexers
//各端口的链接管理监听
createConnectionManagerListener();
// Create the port listener for external components
//外部元件端口监听
createComponentListener();
// Create the port listener for clients
//客户端端口监听
createClientListeners();
// Create the port listener for secured clients
//SSL安全端口监听
createClientSSLListeners();
}
各种容错条件之后,挨个建立了监听器,目前我们只对客户端监听感兴趣,其他的先放着,从客户端监听的create函数内容来看,实际上是对成员变量 socketAcceptor 的初始化,对于socketAcceptor ,可以看到如下说明:
MINA框架提供的基于TCP/IP的实现了IO传输接口的socket,具体原理和功用还得搞清楚了阿帕奇的那套框架才行。其余的设置都是针对这套接口的一些初始化。出来之后进入各路监听器的start,无独有偶,我们在startListeners 中找到了:
// Start the port listener for clients
startClientListeners(localIPAddress);
在开启客户端监听中,可以找到核心的绑定代码:
对头,mina 提供的socket 通过bind方法绑上了openfire实现的IoHander类ClientConnectionHandler ,该类也是后续实现监听客户端发来各路信息的关键。剩下的流程,网上找到的一张流程图就可以概括了:
所有消息包的处理都在这张图上,当然也包括注册、登录。在理解MINA框架的基础上,熟悉了该消息传递流程,才算是迈出是了解openfire详细实现的第一步。