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