上篇写了数据由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的数据处理!