tigase源码分析7:用户连接登录流程

//在看本节之前一定要先了解下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投
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值