openfire和mina(二)

      上篇写了数据由MINA层到了XMPP层,接下来看看数据(XMPP)是在OPENFIRE的XMPP层里都被做什么处理了,由于研究的时间比较短,只能大概写一下。

      可以看到数据在messageReceived()中被StanzaHandler处理了。

 

 

上面是类图,只画了C-S的(ClientStanzaHandler)的。

首先如果是有新客户端连接的话会调用sessionOpened().然后创建一个ClientStanzaHandler。

接着数据在MINA框架经过第一次解码(XMPPCodecFactory)后传到ConnectionHandler中的

messageReceived(),然后处理客户端发来的XMPP包,StanzaHandler 会解析数据包(process),

如果是"<stream:stream"开头的话会为此客户端创建一个clientsession(createSession()).

下面是代码片段:

 


 boolean initialStream = stanza.startsWith("<stream:stream" ) || stanza.startsWith("<flash:stream" );
        if (!sessionCreated || initialStream) {
            if (!initialStream) {
                // Allow requests for flash socket policy files directly on the client listener port
                if (stanza.startsWith("<policy-file-request/>" )) {
                    String crossDomainText = FlashCrossDomainServlet.CROSS_DOMAIN_TEXT +
                            XMPPServer.getInstance().getConnectionManager().getClientListenerPort() +
                            FlashCrossDomainServlet.C ROSS_DOMAIN_END_TEXT + '/0' ;
                    connection.deliverRawText(crossDomainText);
                    return;
                }
                else {
                    // Ignore <?xml version="1.0"?>
                    return ;
                }
            }
            // Found an stream:stream tag...
            if (!sessionCreated ) {
                sessionCreated = true;
                MXParser parser = reader.getXPPParser();
                parser.setInput(new StringReader(stanza));
                createSession(parser);
            }

 

 


 

     以后再有 xmpp数据过来的话,会送到clientSession中去处理,比如给好友发消息,到clientSession中解析完了后,会调用deliver()由NIOConnection发到MINA层中。

 

   至此,数据从C----->S的简单流程就完事了,以后有时间会写S----->S的数据处理!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章