//在看本节之前一定要先了解下xmpp协议,建议仔细看下 tigase源码分析6:了解xmpp协议
//在看下面代码之前,要知道,每一个用户User通过某一资源连接到服务器时,
//每一个User在不同的资源上登录都各对应着一个IOService,
//每一个资源对应着一个XMPPResourceConnection,
//同一个用户User多个XMPPResourceConnection可能共同引用着同一个XMPPSession
public IOService<?> IOService.call() throws IOException {
......
//当socket有数据要处理的时候,进行解析
processSocketData();
if ((receivedPackets() > 0) && (serviceListener != null)) {
serviceListener.packetsReady(this);
} // end of if (receivedPackets.size() > 0)
.....
}
protected void XMPPIOService.processSocketData() throws IOException {
.....
//解析socket数据
parser.parse(domHandler, data, 0, data.length);
....
}
public final void SimpleParser.parse(SimpleHandler handler, char[] data, int off, int len) {
.....
//遇到<stream:stream>
handler.startElement(parser_state.element_name, null, null);
......
}
public void XMPPDomBuilderHandler.startElement(StringBuilder name, StringBuilder[] attr_names,
StringBuilder[] attr_values) {
......
//服务端也打开一个对应的<stream:stream>
service.xmppStreamOpened(attribs);
........
}
protected void XMPPIOService.xmppStreamOpened(Map<String, String> attribs) {
...
String response = serviceListener.xmppStreamOpened(this, attribs);
...
}
public String ClientConnectionManager.xmppStreamOpened(XMPPIOService<Object> serv,
Map<String,String> attribs) {
....
if (id == null) {
//生成一些属性
id = UUID.randomUUID().toString();
serv.getSessionData().put(IOService.SESSION_ID_KEY, id);
serv.setXMLNS(XMLNS);
serv.getSessionData().put(IOService.HOSTNAME_KEY, hostname);
serv.setDataReceiver(JID.jidInstanceNS(routings.computeRouting(hostname)));
String streamOpenData = prepareStreamOpen(serv, id, hostname);
//给客户端回一个<stream:stream>告诉他服务端也打开了stream
writeRawData(serv, streamOpenData);
//生成一个新的iq请求packet,主要作用是通知打开session connection
Packet streamOpen = Command.STREAM_OPENED.getPacket(serv.getConnectionId(), serv
.getDataReceiver(), StanzaType.set, this.newPacketId("c2s-"), Command.DataType.submit);
//设置一些属性
Command.addFieldValue(streamOpen, "session-id", id);
Command.addFieldValue(streamOpen, "hostname", hostname);
Command.addFieldValue(streamOpen, "xml:lang", lang);
//把刚新生成的packet投
tigase源码分析7:用户连接登录流程
最新推荐文章于 2019-02-20 16:17:00 发布