XMPP file Transfer (转)

来源:互联网 发布:mac如何下载千牛 编辑:程序博客网 时间:2024/05/30 07:13
 

SOCK5流协商的建立一部分通过XMPP XML流,一部分通过一个独立的socket
实际的文件传输发生在创建的socket上。

第一步:
[发送端] 发送SI(流协商)包A
A:
<iq type='set' id='gaim8215f9ef' to='test@dd.antkingdom.com/Exodus'>
<si xmlns='http://jabber.org/protocol/si' id='gaim8215f9f0' profile='http://jabber.org/protocol/si/profile/file-transfer'>
<file xmlns='http://jabber.org/protocol/si/profile/file-transfer' name='backup.txt' size='2043'/>
<feature xmlns='http://jabber.org/protocol/feature-neg'>
<x xmlns='jabber:x:data' type='form'><field var='stream-method' type='list-single'>
<option><value>http://jabber.org/protocol/bytestreams</value></option>
</field>
</x>
</feature>
</si>
</iq>
[接收端] 接收A: 发送SI响应包B
B:
<iq id="gaim8215f9ef" to="jjl@dd.antkingdom.com/Home" type="result">
<si id="gaim8215f9f0" xmlns="http://jabber.org/protocol/si">
<feature xmlns="http://jabber.org/protocol/feature-neg">
<x type="submit" xmlns="jabber:x:data">
<field var="stream-method"><value>http://jabber.org/protocol/bytestreams</value></field>
</x>
</feature>
</si>
</iq>

第二步:
[发送端] 接收B
创建socket,绑定一个地址,并监听(记下IP与端口号),等待连接
构造出如下的bytestream包C,发送包C
C:
<iq type='set' id='gaim8215f9f1' to='test@dd.antkingdom.com/Exodus'>
<query xmlns='http://jabber.org/protocol/bytestreams' sid='gaim8215f9f0'>
<streamhost jid='jjl@dd.antkingdom.com/Home' host='192.168.100.1' port='6642'/>
</query>
</iq>
[接收端] 接收C:
创建一个socket, connect C包中指定的host与port
开始socket 5协商

socket 5协商完毕,发送bytestream响应包D
D:
<iq from='test@dd.antkingdom.com/Exodus' type='result'to='jjl@dd.antkingdom.com/Home' id='gaim8215f9f1'>
<query xmlns='http://jabber.org/protocol/bytestreams' sid='gaim8215f9f0'>
<streamhost-used jid='jjl@dd.antkingdom.com/Home'/>
</query>
</iq>
第三步:
[发送端] 接收D
开始文件传输

 

Socket 5协商过程
一、[接收端]发送5,1,0
二、[发送端]接收到5,1,0,发送5,0
三、[接收端]接收到5,0,发送5,1,0,3+digest长度+0+0
注:digest是通过sessionID, 流发起者,流接收者,通过哈希算法得到的一个字符串
四、[发送端]接收到5,1,0,3+digest长度+0+0,发送5,0,0,3+digest长度+0+0

五、socket 协商完毕,建立了P2P的连接,下面通过这个连接的socket就可以进行文件传输了。