上篇寫了數據由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的數據處理!