openfire客户端文件传输学习笔记(一)
<iq?to="android@192.168.1.113/Spark?2.6.3"?type="set"?id="iq_13"?from="iphone@192.168.1.113/xiff">
????<si?profile="http://jabber.org/protocol/si/profile/file-transfer"?mime-type="text/plain"?id="82B0C697-C1DE-93F9-103E-481C8E7A3BD8"?xmlns="http://jabber.org/protocol/si">
????????<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>
????????????????????<option><value>http://jabber.org/protocol/ibb</value></option>
????????????????</field>
????????????</x>
????????</feature>
????????<file?xmlns="http://jabber.org/protocol/si/profile/file-transfer"?name="img0545.png"?size="152443"><desc>send</desc></file>
????</si>
</iq>
?
目标方接收到信息后发送回执,表示同意接收文件
?
<iq?id="iq_13"?to="iphone@192.168.1.113/xiff"?from="android@192.168.1.113/Spark?2.6.3"?type="result">?
这时进入XEP-0065协议阶段
初始方给服务器发送信息,请求提供代理服务器
?
<iq?id="iq_15"?type="get"><query?xmlns="http://jabber.org/protocol/disco#items"?/></iq>
服务器回复信息,告知可用的代理
?
<iq?type="result"?id="iq_15"?to="iphone@192.168.1.113/xiff">?
这里选择name=“Socks 5 Bytestreams Proxy”的代理,初始方给这个代理发送信息获取代理连接信息
?
<iq?id="iq_17"?to="proxy.192.168.1.113"?type="get"><query?xmlns="http://jabber.org/protocol/bytestreams"?/></iq>代理方回复信息,告知初始方代理的jid、IP、端口等信息
?
<iq?type="result"?id="iq_17"?from="proxy.192.168.1.113"?to="iphone@192.168.1.113/xiff">?
初始方收到代理信息后将代理的信息发送给目标方
?
<iq?to="android@192.168.1.113/Spark?2.6.3"?type="set"?id="iq_19"?from="iphone@192.168.1.113/xiff">?
然后就进入连接阶段,也就是初始方和目标方分别和代理建立socks5连接的过程。(关于SOCKS5协议连接,我之后会补充)。
目标方收到代理信息后和代理建立socket连接(使用SOCKS5协议连接),连接成功后通知初始方使用的代理jid
?
<iq?id="iq_19"?to="iphone@192.168.1.113/xiff"?type="result"?from="android@192.168.1.113/Spark?2.6.3">?
初始方开始与代理建立socket连接(也使用SOCKS5协议),连接成功后给代理发送请求,要求激活文件流
?
<iq?to="proxy.192.168.1.113"?type="set"?id="iq_21"?from="iphone@192.168.1.113/xiff">?
代理回复激活成功信息
?
<iq?type="result"?id="iq_21"?from="proxy.192.168.1.113"?to="iphone@192.168.1.113/xiff"/>初始方收到回复信息后就进入二进制流传输阶段,这时就可以开始发送二进制流了
等初始方将流发送完毕后把socket流关闭传输就完成了文件的传输。
?
注意:type为result的回复信息使用的id一定要和请求的信息id一样。