openfire connectionmanager源码分析

服务器启动:
ConnectionManager
start()
startModules():
ServerSurrogate:可创建多个连接到业务服务器,把连接信息保存到map中
start():遍历map,测试到业务服务器的连接是否正常
SocketSendingTracker:
start():从SocketConnection中获取连接,检查连接状态
startClientListeners(),初始化mino的监听,设置filter:XMPPCodecFactory、StalledSessionsFilter(如果写的包大于5M就关闭连接)
绑定连接处理器:ClientConnectionHandler(extends ConnectionHandler)
startClientSSLListeners()
startHttpBindServlet()

服务器每次接收客户端发过来的数据可能不是一个完整的xml,XMPPCodecFactory中会进行处理,再到下面的处理就是正确的xml了

接收客户端发过来的协议:

ConnectionHandler
messageReceived():
StanzaHandler.process() 处理stream协议
ServerRouter.route()
ServerSurrogate.send()
在线程池中执行线程:RouteTask.run。
将当前线程转换为ConnectionWorkerThread,执行ConnectionWorkerThread.deliver()
上一步中的线程池是通过ConnectionsWorkerFactory创建的,所以才可以讲RouteTask转换为ConnectionWorkerThread
并且在创建线程的时候,将ConnectionWorkerThread保存到map中了。
创建ConnectionWorkerThread的时候,会创建到业务服务器的连接
这里每个线程对应一个到业务服务器的连接,由于线程是保存在线程池中的,所以线程不会销毁,到业务服务器的连接也不会中断
当线程不够用的时候,线程池自动创建新的线程,新的线程会再创建一个到业务服务器的连接,这样即使其中一个连接阻塞了也没关系。
ConnectionWorkerThread.deliver():这里将协议包装为route协议
SocketConnection.deliver()
接收业务服务器的数据:
ConnectionWorkerThread中连接到也业务服务器时,会设置XMPPPacketReader,然后构造一个ServerPacketReader,在ServerPacketReader中开线程处理来自业务服务器的数据
ProcessSessionQueueTask.run()或ProcessStanzaTask.run()
ServerPacketHandler.handle()
ServerPacketHandler.processRoute():根据streamid取出ClientSession
ClientSession.deliver()


客户端的连接是什么时候保存的呢?
StanzaHandler.process()
Stanzahandler.createSession
ClientStanzaHandler.createSession()
ClientSession.createSession()
Session.addSession()
streamid是创建客户端session时生成的,组装route协议时将streamid加上了,业务服务器返回协议中也有streamid,根据streamid找到Session,就可以将协议返回给客户端
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值