版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w690333243/article/details/81984421
10.10.2.120服务器账号 [email protected] 发送消息给[email protected]
以下为log
https://download.csdn.net/download/w690333243/10638078
其中方法调用
Src/main/java/tigase/server/ConnectionManager.java
private static ConnectionOpenThread connectThread = ConnectionOpenThread.getInstance();
->setProperties()
->addWaitingTask(port_props) ->reconnectService
->startService(port_props) ->addConnectionOpenListener
ConnectionManage.ConnectionListenerImpl
->cli.accept(SocketChanne sc)
->IO serv = getXMPPIOServiceInstance();
serv.accept(sc);
->socketIO = new SocketIO(socketChannel);
IOInterface getSocketChannel
ConnectionOpenThread : 实现了runnable接口,监听xmpp连接
getInstance(){new Thread(new ConnectionOpenThread()).start}
SocketThread.java
static
{new Thread(socketReadThread[i]).start}
run()
->completionService.submit(serv);
IOService.java
->Call()
-> serviceListener.packetsReady(this);
ConnectionManager.java
->packetsReady(IO serv)
->processSocketData(serv)
src/main/java/tigase/server/xmppclient/ClientConnectionManager.java
->processSocketData(serv)
->addOutPacket(p);
AbstractMessageReceiver.java
->addOutPacket(p);
->out_queues.get(queueIdx).put(packet, packet.getPriority().ordinal());
src/main/java/tigase/server/AbstractMessageReceiver.java
startThreads()
AbstractMessageReceiver.QueueListener.java extends Thread
run()
-> packet = queue.take();
-> processPacket(packet);
src/main/java/tigase/server/ConnectionManager.java
->writePacketsToSocket(serv, processSocketData(serv));
-> serv.addPacketToSend(p);
->serv.processWaitingPackets();
XMPPIOService.java
->processWaitingPackets()
Src/main/java/tigase/server/xmppsession/SessionManager.java
->handleLogin()
组件的getDefaults()方法调用流程
Src/main/java/tigase/server/XmppServer.java
->setConfig()
Src/main/java/tigase/server/MessageRouter.java
-> addRegistrator()
Src/main/java/tigase/server/AbstractComponentRegistrator.java
-> addComponent()
Src/main/java/tigase/conf/ConfiguratorAbstract.java
-> componentAdded()
->setup()
->component.getDefaults(getDefConfigParams()),component.setProperties(prop);
Src/main/java/tigase/server/xmppsession/SessionManager.java
->getDefaults()
跨服务器的流程和本地路由基本与相似,
可以参考https://blog.csdn.net/Cancer_DD/article/details/38872497
不同点
MessageRouter.processPacket(Packet packet)部分代码如下:
@Override
public void processPacket(Packet packet) {
//getTo 方法取pcketTo的值,若为空,则取stanzaTo(中的to)
if (packet.getTo() == null) {
return;
}
...
//匹配分发组件
ServerComponent comp = getLocalComponent(packet.getTo());
if (comp != null) {
Queue results = new ArrayDeque();
if (comp == this) {
processPacketMR(packet, results);
} else {
...
comp.processPacket(packet, results);
}
...
return;//匹配本地组件成功
}
ServerComponent[] comps = getComponentsForLocalDomain(host);
if (comps == null) {
// Still no component found, now the most expensive lookup.
// Checking regex routings provided by the component.
comps = getServerComponentsForRegex(packet.getTo().getBareJID().toString());
}
...
}
匹配本地组件不成功,Packet will be processed by: s2s@localhost,由AbstractMessageReceiver的非阻塞性方法addPacketNB(Packet packet)加入到out_queues。将调用s2s组件,即S2SConnectionManager.java代码中打开连接失败(120到130的连接)将会使用tcp协议建立和其的连接,连接建立后会回调IOService.handshakeCompleted() 方法