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源代码研究相关推荐

  1. 通过源代码研究ASP.NET MVC中的Controller和View(二)

    通过源代码研究ASP.NET MVC中的Controller和View(一) 在开始之前,先来温习下上一篇文章中的结论(推论): IView是所有HTML视图的抽象 ActionResult是Cont ...

  2. 通过分析 JDK 源代码研究 Hash 存储机制

    http://www.ibm.com/developerworks/cn/java/j-lo-hash/ 通过分析 JDK 源代码研究 Hash 存储机制 HashMap 和 HashSet 是 Ja ...

  3. 通过源代码研究ASP.NET MVC中的Controller和View(三)

    通过源代码研究ASP.NET MVC中的Controller和View(一) 通过源代码研究ASP.NET MVC中的Controller和View(二) 第三篇来了,上一篇我已经把VirtualPa ...

  4. 传奇3源代码研究总结【实用】

    浏览量:42 回复数:7 复制链接 分享到: qq 人人 新浪 小米 推客 2004年暑期之前,我有幸得到了传奇3的源代码,经过本人大半年的工作,该代码已经全部调试通过,但由于本人的精力有限,不能最大 ...

  5. Openfire开发配置,Openfire源代码配置,OpenFire二次开发配置

    1.下载源代码:http://www.igniterealtime.org/downloads/source.jsp 2.把源代码解压出的openfire_src文件夹放至eclipse workpl ...

  6. 通过分析 JDK 源代码研究 Hash 存储机制--转载

    通过 HashMap.HashSet 的源代码分析其 Hash 存储机制 集合和引用 就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java 对象放入数组中,只是把对象 ...

  7. 通过分析 JDK 源代码研究 TreeMap 红黑树算法实现--转

    TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常 ...

  8. WordPress源代码研究-插件机制

    2019独角兽企业重金招聘Python工程师标准>>> 先前说过WP所有的处理都在index.PHP里,单入口.而这里面又分成了两步. 一个是数据的准备,第二是模板的加载.那我们的插 ...

  9. Spring5源代码研究01:源码导入与环境搭建(完美无错误)

    为了阅读分析Spring 5源代码,需要搭建环境将源代码导入到本地.我们使用IntelliJ IDEA作为IDE工具来分析源码.网上有很多教程要么太老,要么没有经过实践验证,要么不完美报一堆错误. 本 ...

最新文章

  1. 阿里某员工面试华为后吐槽:面试官太水,反问几句都答不上来
  2. C语言中的#ifndef、#def、#endif等宏
  3. C++Pascal‘s Triangle杨辉三角的实现算法
  4. 《NIOSII那些事儿》rev7.0 PDF版本发布
  5. springboot+sockjs进行消息推送(群发)
  6. Java内部类的使用小结
  7. 2017-2018-1 20155227 《信息安全系统设计基础》第十一周学习总结
  8. linux下硬盘安装ubuntu,Ubuntu硬盘安装
  9. windows安装mysql修改密码_1、Windows下安装mysql-8.0.12及修改初始密码
  10. Windows 无法卸载IE9怎么办
  11. java macd_MACD到底是什么?
  12. 什么是云服务器ECS?
  13. 机房合作—SVN skipped remains conflicted
  14. 5.2 差模信号、共模信号、共模抑制比
  15. 基于Java毕业设计缘梦书屋网站源码+系统+mysql+lw文档+部署软件
  16. 算术左、右移位与逻辑左、右移位,右移一位和除二的区别、算术溢出
  17. 【android】喜马拉雅FM sdk使用
  18. 往hive表中插入与导出数据方式load ,insert ,sqoop 等方式详解
  19. EXCEL图表:使用excel画坐标轴图
  20. 怎样判断一个P2P平台是否靠谱?

热门文章

  1. Latex: 调整文档的行距
  2. go和python哪个好_新学语言,选GO还是Python
  3. 区块链应用:椭圆曲线数字签名算法ECDSA
  4. Windows Mobile开发总结
  5. SpringBoot实现本地上传Word文档并在线预览
  6. 机器学习之支持向量机算法
  7. myBatis-plus实现先按条件查询,再把查询结果分页(基于xboot框架的前后端分离项目的一部分)
  8. leetcode104---求二叉树深度
  9. U盘/移动硬盘拔出提示被占用情况的处理办法
  10. 2021年G1工业锅炉司炉答案解析及G1工业锅炉司炉新版试题