Openfire注册流程代码分析
Openfire注册流程代码分析
一、客户端/服务端注册用户流程
经过主机连接消息确认后,客户端共发送俩条XML完成注册过程。服务器返回两条XML。
注:IQ消息节点用于处理用户的注册、好友、分组、获取在线用户列表等
MESSAGE消息节点用于处理用户的消息发送等等
PRESENCE消息节点用户处理用的在线状态,例如用户上线、离线、忙等。
客户端: 告诉服务器注册从那个地址发出
·<iq id="i82YJ-304" to="lonely" type="get"><query xmlns="jabber:iq:register"></query></iq>服服务器:返回用户完成注册需要的xml格式
<iq type="result" id="i82YJ-304" from="lonely">
<query xmlns="jabber:iq:register">
<username/><password/><email/><name/>
<x xmlns="jabber:x:data" type="form">
<title>XMPP Client Registration</title>
<instructions>Please provide the following information</instructions>
<field var="FORM_TYPE" type="hidden"><value>jabber:iq:register</value></field>
<field label="Username" var="username" type="text-single"><required/></field>
<field label="Full name" var="name" type="text-single"/>
<field label="Email" var="email" type="text-single"/>
<field label="Password" var="password" type="text-private"><required/></field>
</x>
</query>
</iq>
客户端:继续发送,实施注册
·<iq id="i82YJ-305" to="lonely" type="set">
<query xmlns="jabber:iq:register">
<username>a1</username>
<email></email>
<name></name>
<password>a</password>
</query></iq>
服务器:实施注册后,返回如下:
<iq type="result" id="i82YJ-305" from="lonely" to="lonely/5a5c59a7"/>
服务器消息接收处理类 ClientConnectHandler/ConnectionHandler(在eclipse中按ALT+SHIT+T进行查找)
消息接收方法:messageReceived(),当客户端第二次发送XML到客户端时,进入到ConnectionHandler类的messageReceived方法,进入以后执行以下详细操作:
1:获取当前会话的StanzaHandler类,即业务处理类(ClientStanzaHandler类)。
2:实例化XMPPPacketReader(这个类是做XML解析的,读取XML封装成Packet)。
3:调用ClientStanzaHandler的process方法,进入。
4:ClientStazaHandler没有process方法,进入到父类(StanzaHandler类的process方法)
5:进行各种判断,看当前XML请求是什么需求。
6:进入到process(doc)方法。
7:判断是message,presence还是iq,如果都不是,抛出UnknownPacketException。
8:进入到processIQ(packet)方法。
9:调用router.route(packet)方法,router的具体实现类是:IQRouter。
10:进入到IQRouter的handle(packet)方法。
11:运行IQHandler handler = getHandler(namespace)这行代码。Handler的具体实现类是:IQRegisterHandler。调用handler.process(packet)方法,首先执行IQHandler的process方法。进入。
12:执行handleIQ(iq),根据多态原则,进入到IQRegisterHandler的process方法中。
13:将XML封装成User对象,调用底层数据库方法,进行存储。
14:生成返回的reply Packet。
15:session.process(reply);返回reply到客户端。Session的实例类是:LocalClientSession,进入到其父类(LocalSession)process()方法。
16:调用deliver()方法。回到LocalClientSession类的deliver()方法。进入。
17:调用conn.deliver(packet);conn的实例类是:NIOConnection类。进入。
18:判断连接是否断开,没有断开,继续往下。断开调用备用发送器发送。
19:实例化XMLWriter类,取得Packet的Element节点,调用XMLWriter的write()方法写入。
20:flush缓存。确认写入缓存中。
21:用二进制流传输到客户端。
21:返回回复到客户端的XML如下:
<iq type="result" id="i82YJ-305" from="lonely" to="lonely/5a5c59a7"/>
二、Openfire启动过程分析
以下是openfire前期启动时,服务监听代码分析。
从openfire源码分析中,可以知道,在loadModule()过程中,其中整个服务器的消息收发监听类是:ConnectionManagerImpl,然后调用它的Start()方法。(所有的Module都集成BaseModule类,分别重写Start,initialize等方法。)
在ConnectionManagerImpl经过初始化initialize()执行过后,执行他的Start()方法,在Start方法里,共进行了以下操作:
super.start();
createListeners();
startListeners();
SocketSendingTracker.getInstance().start();
CertificateManager.addListener(this);
1:调用BaseModule的Start方法。(此方法为空方法体)
2:创建监听器。此方法中共创建了五个监听器。
·createServerListener(localIPAddress);
创建服务器监听,用来完成S2S服务器之间的会话。
·createConnectionManagerListener();
创建网络连接管理监听,用来管理来自各个端到此服务器的Socket连接。
·createComponentListener();
创建其他部件的端口监听,比如声音传输监听端口。
·createClientListeners();
创建客户端端口监听。
·createClientSSLListeners();
创建客户端SSL验证端口监听。
3:启动监听器。在启动上面创建的相应的监听器之前,需要做插件管理的监听启动操作。
首先判断插件是否被加载,如果没有则启动监听器。
接下来启动第二步所创建的那些监听器。
最后启动HTTP连接监听器。(监听HTTP连接)
4:启动连接追踪接口。判断当前连接是否正常,线程是否死掉。如果有异常就重新启动。
5:证书管理监听。至此,ConnectionManagerImpl用到的监听接口都已经启动。
三、注册监听处理过程
在注册过程中,有客户端发送注册数据到服务器端实现注册。该动作被服务器端的ClientListeners接收,并做相应的处理。接下来是关于ClientListeners的启动监听过程分析。即ConnectionManagerImpl中的startClientListeners()方法源码解析。
1:判断客户端监听器是否可用。
2:获取服务器端地址。可在openfire.xml中进行配置,配置节点为:network.interface。如果没有则取本机地址作为服务器地址。
3:实例化SocketAcceptor,启动Socket监听,同时绑定处理类。在openfire中是ClientConnectionHandler类,该类继承ConnectionHandler,ConnectionHandler则继承与IohandlerAdapter,这些是根据Apache MINA框架设计而成。
4:添加多个端口监听。
至此,我们可以通过上面的分析知道,当注册数据发送到openfire时,则交给ClientConnectHandler类的messageRecieved()方法进行处理。这样就可以跟上面的分析联系起来。
四、OPENFIRE消息包接收处理流程图

Openfire注册流程代码分析的更多相关文章
- Linux Kernel文件系统写I/O流程代码分析(二)bdi_writeback
Linux Kernel文件系统写I/O流程代码分析(二)bdi_writeback 上一篇# Linux Kernel文件系统写I/O流程代码分析(一),我们看到Buffered IO,写操作写入到 ...
- Ecshop的购物流程代码分析详细说明
Ecshop的购物流程代码分析详细说明 (2012-07-30 10:41:12) 转载▼ 标签: 购物车 结算中心 商品价格 ecshop ecshop购物流程 杂谈 分类: ECSHOP研究院 同 ...
- Linux Kernel文件系统写I/O流程代码分析(一)
Linux Kernel文件系统写I/O流程代码分析(一) 在Linux VFS机制简析(二)这篇博客上介绍了struct address_space_operations里底层文件系统需要实现的操作 ...
- pf_ring DNA接收流程代码分析
经过一个月的学习,对pf_ring DNA的内核部分有了一些认识,本文侧重pf_ring对ixgbe的改动分析. 先说一说接收流程吧,流程如下: 其中,硬中断处理函数是ixgbe_msix_clean ...
- [Android]Android焦点流程代码分析
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/7286503.html 通过View的View::focusSe ...
- 【Heritrix基础教程之4】开始一个爬虫抓取的全流程代码分析
在创建一个job后,就要开始job的运行,运行的全流程如下: 1.在界面上启动job 2.index.jsp 查看上述页面对应的源代码 <a href='"+request.getCo ...
- VSM(Virtual Storage Manager) add new osd 代码分析
vsm add new osd 流程 后台获取可用设备 | 选择可用设备及osd相关信息等 | 点击add按钮,把准备部署的osd信息添加到需要部署的item列表中 | 点击submit按钮,添加it ...
- 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)
退出Activity注册Android遍历 目录(?)[+] 前言 知识结构 具体方案 方案1 方法采用FLAG_ACTIVITY_CLEAR_TOP退出整个程序多activity 方案2 方 ...
- 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)
前言 由于一个同学问到我如何按照一个流程走好之后回到首页,我以前看到过4个解决方案,后来发现有做个记录和总结的必要,就写了这篇博文.(之前看小强也写过一篇,这里通过自身的分析完整的总结一下以下6种 ...
随机推荐
- 【LeetCode】173. Binary Search Tree Iterator (2 solutions)
Binary Search Tree Iterator Implement an iterator over a binary search tree (BST). Your iterator wil ...
- java 实现唯一ID生成器
2014-11-08 内容存档在evernote,笔记名"java 实现唯一ID生成器"
- AI 高等数学、概率论基础
一.概论 基础引入: 原理一:[两边夹定理] 原理二:[极限] X为角度x对应的圆弧的点长: 原理三[单调性]: 引入: 二.导数 常见函数的导数: 四.应用: 求解: 泰勒展式和麦克劳林展式: 泰勒 ...
- IIS7虚拟目录出现HTTP错误500.19(由于权限不足而无法读取配置文件)的解决方案
今天在window7上配置asp.net网站,但是访问总是提示 错误摘要HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该页的相关配置数据无效.详细 ...
- Centos 安装GIT 1.7.1
在Linux上安装Git 1.首先,你可以试着输入git,看看系统有没有安装Git: git 2.安装GIT https://git-scm.com/download/linux yum instal ...
- 高并发分布式系统中生成全局唯一(订单号)Id js返回上一页并刷新、返回上一页、自动刷新页面 父页面操作嵌套iframe子页面的HTML标签元素 .net判断System.Data.DataRow中是否包含某列 .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数
高并发分布式系统中生成全局唯一(订单号)Id 1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的方式,保留GUID的10个字节,用另6个字节表示GUID生成的时间(D ...
- 【转载】java前后端 动静分离,JavaWeb项目为什么我们要放弃jsp?
原文:http://blog.csdn.net/piantoutongyang/article/details/50878214 今天看到两篇文章,讲解 为什么web开发启用jsp,确实挺有道理,整理 ...
- Android Camera开发:给摄像头预览界面加个ZoomBar(附完整代码下载)
源码:http://files.cnblogs.com/android100/StandardCamera2013-10-18.zip 废话不说了,就是加个seekbar,拖动的话能够调节焦距,让画面 ...
- Java 利用 poi 生成 Excel文件的通用例子
在用java 写数据库应用的时候, 通常会生成各种报表,而这些报表可能会被导出为各种格式的文件,比如Excel文档,pdf 文档等等. 今天先做了一个生成Excel 文档的例子,主要解决以下问题: 生 ...
- 转: 使用Hystrix实现自动降级与依赖隔离
使用Hystrix实现自动降级与依赖隔离 原创 2017年06月25日 17:28:01 标签: 异步 / 降级 869 这篇文章是记录了自己的一次集成Hystrix的经验,原本写在公司内部wiki里 ...