zoukankan      html  css  js  c++  java
  • 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:调用ClientStanzaHandlerprocess方法,进入。

    4ClientStazaHandler没有process方法,进入到父类(StanzaHandler类的process方法)

    5:进行各种判断,看当前XML请求是什么需求。

    6:进入到process(doc)方法。

    7:判断是messagepresence还是iq,如果都不是,抛出UnknownPacketException

    8:进入到processIQ(packet)方法。

    9:调用router.route(packet)方法,router的具体实现类是:IQRouter

    10:进入到IQRouterhandle(packet)方法。

    11:运行IQHandler handler = getHandler(namespace)这行代码。Handler的具体实现类是:IQRegisterHandler。调用handler.process(packet)方法,首先执行IQHandlerprocess方法。进入。

    12:执行handleIQ(iq),根据多态原则,进入到IQRegisterHandlerprocess方法中。

    13:将XML封装成User对象,调用底层数据库方法,进行存储。

    14:生成返回的reply Packet

    15session.process(reply);返回reply到客户端。Session的实例类是:LocalClientSession,进入到其父类(LocalSession)process()方法。

    16:调用deliver()方法。回到LocalClientSession类的deliver()方法。进入。

    17:调用conn.deliver(packet);conn的实例类是:NIOConnection类。进入。

    18:判断连接是否断开,没有断开,继续往下。断开调用备用发送器发送。

    19:实例化XMLWriter类,取得PacketElement节点,调用XMLWriterwrite()方法写入。

    20flush缓存。确认写入缓存中。

    21:用二进制流传输到客户端。

    21:返回回复到客户端的XML如下:

    <iq type="result" id="i82YJ-305" from="lonely" to="lonely/5a5c59a7"/>

    二、Openfire启动过程分析

    以下是openfire前期启动时,服务监听代码分析。

    openfire源码分析中,可以知道,在loadModule()过程中,其中整个服务器的消息收发监听类是:ConnectionManagerImpl,然后调用它的Start()方法。(所有的Module都集成BaseModule类,分别重写Startinitialize等方法。)

    ConnectionManagerImpl经过初始化initialize()执行过后,执行他的Start()方法,在Start方法里,共进行了以下操作:

      super.start();

            createListeners();

            startListeners();

            SocketSendingTracker.getInstance().start();

            CertificateManager.addListener(this);

    1:调用BaseModuleStart方法。(此方法为空方法体)

    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类,该类继承ConnectionHandlerConnectionHandler则继承与IohandlerAdapter,这些是根据Apache MINA框架设计而成。

    4:添加多个端口监听。

    至此,我们可以通过上面的分析知道,当注册数据发送到openfire时,则交给ClientConnectHandler类的messageRecieved()方法进行处理。这样就可以跟上面的分析联系起来。

    四、OPENFIRE消息包接收处理流程图

     

  • 相关阅读:
    socket架构
    异常处理
    类的装饰器
    with&as上下文管理协议
    软件开发规范
    面向对象-描述符
    面向对象-迭代器
    面向对象编程多种特性
    体验Visual Studio 2015 之 MVC
    MVC 好记星不如烂笔头之 ---> 全局异常捕获以及ACTION捕获
  • 原文地址:https://www.cnblogs.com/tiancai/p/10064534.html
Copyright © 2011-2022 走看看