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的數據處理!

 

 

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