Openfire源代码研究二

 

Openfiresocket网络连接包括:

<!--[if !supportLists]-->1.       <!--[endif]-->服务器和服务器之间的连接(监听在端口5269

<!--[if !supportLists]-->2.       <!--[endif]-->外部组件和服务器之间的连接(监听在端口5275

<!--[if !supportLists]-->3.       <!--[endif]-->多元(complex)连接(监听在端口5269

<!--[if !supportLists]-->4.       <!--[endif]-->客户端和服务器的连接(监听在端口5222

<!--[if !supportLists]-->5.       <!--[endif]-->和客户端通过TLS/SSL3.0和服务器的连接。(监听在端口5223

 

这些连接都是通过ConnectionManager接口实现管理的,程序中对ConnectionManager接口的实现类是ConnectionManagerImpl,它是作为一个模块(Module)类加载到服务器中的。

ConnectionManagerImpl中是通过调用startClientListeners方法来初始化和开始端口监听的。

<!--[if !vml]--><!--[endif]-->startClientListeners方法使用的是ApacheMina框架来实现网络连接的,Mina框架的模式如下:

 

 

下面分析的是客户端和服务器的连接。

 

 

  Mina框架

 

 

 

 

 

 

 

 

 

  Mina框架

 

 

 

 

 

 

 

 

 

 

 

 

IoFilter

       IoFilterMINA的功能扩展提供了接口。它拦截所有的IO事件进行事件的预处理和后处理。它与Servlet中的filter机制十分相似。多个IoFilter存放在IoFilterChain

       IoFilter能够实现以下功能:

              数据转换

              事件日志

              性能检测

       Openfire中主要用filter这种机制来进行数据转换。

 

Protocol Codec Factory

       Protocol Codec Factory提供了方便的Protocol支持,通过它的EncoderDecoder,可以方便的扩展并支持各种基于Socket的网络协议,比如HTTP服务器、FTP服务器、Telnet服务器等等。

       要实现自己的编码/解码器(codec)只需要实现interface: ProtocolCodecFactory即可,在Openfire中实现ProtocolCodecFactory的类为XMPPCodecFactory

 

IoHandler:

    MINA中,所有的业务逻辑都有实现了IoHandlerclass完成    ,当事件发生时,将触发IoHandler中的方法:

           sessionCreated

sessionOpened

sessionClosed

sessionIdle

exceptionCaught

messageReceived

messageSent

       Openfire中客户端和服务器连接的IoHandler实现类是ClientConnectionHandler,它是从ConnectionHandler中继承来的。

 

 

startClientListeners方法首先为Mian框架设置线程池,再将一个由XMPPCodecFactory作为Protocol Codec FactoryFilter放入到FilterChain中,然后绑定到端口5222,并将ClientConnectionHandler作为IoHandler对数据进行处理。完成这些步骤后Openfire就在5222等待客户端的连接。

 

客户端连接的处理过程:

 

当有客户端进行连接时根据Mina框架的模式首先调用的是sessionOpened方法。

       sessionOpened首先为此新连接构造了一个parserXMLLightWeightParser),这个parser是专门给XMPPDecoder(是XMPPCodecFactory的解码器类)使用的,再创建一个OpenfireConnection类实例connection和一个StanzaHandler的实例。最后将以上的parser, connectionStanzaHandler的实例存放在Minasession中,以便以后使用。

 

       当有数据发送过来时,Mina框架会调用messageReceived方法

       messageReceived首先从Minasession中得到在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模块进行处理。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值