﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-我勒个Java-随笔分类-Java的点点滴滴</title><link>http://www.blogjava.net/wkkyo/category/45939.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 13 Feb 2012 08:44:04 GMT</lastBuildDate><pubDate>Mon, 13 Feb 2012 08:44:04 GMT</pubDate><ttl>60</ttl><item><title>openfire客户端文件传输学习笔记（一）</title><link>http://www.blogjava.net/wkkyo/archive/2012/02/13/369827.html</link><dc:creator>wkkyo</dc:creator><author>wkkyo</author><pubDate>Sun, 12 Feb 2012 16:55:00 GMT</pubDate><guid>http://www.blogjava.net/wkkyo/archive/2012/02/13/369827.html</guid><wfw:comment>http://www.blogjava.net/wkkyo/comments/369827.html</wfw:comment><comments>http://www.blogjava.net/wkkyo/archive/2012/02/13/369827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wkkyo/comments/commentRss/369827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wkkyo/services/trackbacks/369827.html</trackback:ping><description><![CDATA[<p>项目中需要用到openfire的文件传输，但是客户端使用flex，官方提供的xiff包中并没有封装文件传输的功能，没办法，研究了几天，在google和官方smock源码的帮助下终于实现了xiff下的文件传输，在这里做个总结。</p>
<p>openfire服务器是基于xmpp协议的，XMPP支持两种文件流传输协议，SOCKS5 Bytestreams和 In-Band Bytestreams，SOCKS5是直接发送二进制流，而IBB是将文件转成base64码进行然后用message的形式进行传输，我这里仅实现了SOCKS5的文件代理传输。<br />SOCKS5文件传输需要用到两个协议，XEP-0065和XEP-0096<br />XEP-0096定义文件传输协议，提供了一个模块化框架使能交换被传输文件的信息以及参数的协商，也就是在传输文件之前协商将要传输的文件信息。<br />XEP-0065定义SOCKS5流传输标准协议，提供用于在任意两个XMPP用户之间建立字节流并进行文件传输。<br />根据我的理解，文件传输的过程分为协商，建立socks5连接，二进制传输这三个阶段<br />协商的过程最复杂，然后是建立连接，传输就比较简单，下面一个一个来讲<br />协商包括初始方、目标方、代理方，初始方就是发送文件方，目标方即文件接收方，代理方是socks5代理服务器，</p>
<p>协商过程就是三方互相发送xml来交换信息的过程，通俗点就是三个人沟通一下传什么文件和怎么传文件。<br />首先遵循XMP-0096协议，初始方给目标方发送包含文件信息的xml</p><pre class="xml" name="code"><div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">iq&nbsp;</span><span style="color: #ff0000">to</span><span style="color: #0000ff">="android@192.168.1.113/Spark&nbsp;2.6.3"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="set"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="iq_13"</span><span style="color: #ff0000">&nbsp;from</span><span style="color: #0000ff">="iphone@192.168.1.113/xiff"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">si&nbsp;</span><span style="color: #ff0000">profile</span><span style="color: #0000ff">="http://jabber.org/protocol/si/profile/file-transfer"</span><span style="color: #ff0000">&nbsp;mime-type</span><span style="color: #0000ff">="text/plain"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="82B0C697-C1DE-93F9-103E-481C8E7A3BD8"</span><span style="color: #ff0000">&nbsp;xmlns</span><span style="color: #0000ff">="http://jabber.org/protocol/si"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">feature&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://jabber.org/protocol/feature-neg"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">x&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="jabber:x:data"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="form"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field&nbsp;</span><span style="color: #ff0000">var</span><span style="color: #0000ff">="stream-method"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="list-single"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">option</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://jabber.org/protocol/bytestreams</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">option</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">option</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://jabber.org/protocol/ibb</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">option</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">field</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">x</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">feature</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">file&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://jabber.org/protocol/si/profile/file-transfer"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="img0545.png"</span><span style="color: #ff0000">&nbsp;size</span><span style="color: #0000ff">="152443"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">desc</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">send</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">desc</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">file</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">si</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">iq</span><span style="color: #0000ff">&gt;</span></div></pre>
<p>&nbsp;<br />目标方接收到信息后发送回执，表示同意接收文件</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">iq&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="iq_13"</span><span style="color: #ff0000">&nbsp;to</span><span style="color: #0000ff">="iphone@192.168.1.113/xiff"</span><span style="color: #ff0000">&nbsp;from</span><span style="color: #0000ff">="android@192.168.1.113/Spark&nbsp;2.6.3"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="result"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">si&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://jabber.org/protocol/si"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">feature&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://jabber.org/protocol/feature-neg"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">x&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="jabber:x:data"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="submit"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">field&nbsp;</span><span style="color: #ff0000">var</span><span style="color: #0000ff">="stream-method"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://jabber.org/protocol/bytestreams</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://jabber.org/protocol/ibb</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">field</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">x</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">feature</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">si</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">iq</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>&nbsp;</p>
<p>这时进入XEP-0065协议阶段<br />初始方给服务器发送信息，请求提供代理服务器</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">iq&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="iq_15"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="get"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">query&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://jabber.org/protocol/disco#items"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;&lt;/</span><span style="color: #800000">iq</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p><br />服务器回复信息，告知可用的代理</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">iq&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="result"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="iq_15"</span><span style="color: #ff0000">&nbsp;to</span><span style="color: #0000ff">="iphone@192.168.1.113/xiff"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">query&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://jabber.org/protocol/disco#items"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">item&nbsp;</span><span style="color: #ff0000">jid</span><span style="color: #0000ff">="proxy.192.168.1.113"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="Socks&nbsp;5&nbsp;Bytestreams&nbsp;Proxy"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">item&nbsp;</span><span style="color: #ff0000">jid</span><span style="color: #0000ff">="pubsub.192.168.1.113"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="Publish-Subscribe&nbsp;service"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">item&nbsp;</span><span style="color: #ff0000">jid</span><span style="color: #0000ff">="conference.192.168.1.113"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="公共房间"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">item&nbsp;</span><span style="color: #ff0000">jid</span><span style="color: #0000ff">="search.192.168.1.113"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="User&nbsp;Search"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">query</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">iq</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>&nbsp;<br />这里选择name=&#8220;Socks 5 Bytestreams Proxy&#8221;的代理，初始方给这个代理发送信息获取代理连接信息</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">iq&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="iq_17"</span><span style="color: #ff0000">&nbsp;to</span><span style="color: #0000ff">="proxy.192.168.1.113"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="get"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">query&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://jabber.org/protocol/bytestreams"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;&lt;/</span><span style="color: #800000">iq</span><span style="color: #0000ff">&gt;</span></div>
<p>代理方回复信息，告知初始方代理的jid、IP、端口等信息</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">iq&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="result"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="iq_17"</span><span style="color: #ff0000">&nbsp;from</span><span style="color: #0000ff">="proxy.192.168.1.113"</span><span style="color: #ff0000">&nbsp;to</span><span style="color: #0000ff">="iphone@192.168.1.113/xiff"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">query&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://jabber.org/protocol/bytestreams"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">streamhost&nbsp;</span><span style="color: #ff0000">jid</span><span style="color: #0000ff">="proxy.192.168.1.113"</span><span style="color: #ff0000">&nbsp;host</span><span style="color: #0000ff">="192.168.1.113"</span><span style="color: #ff0000">&nbsp;port</span><span style="color: #0000ff">="7777"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">query</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">iq</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>&nbsp;<br />初始方收到代理信息后将代理的信息发送给目标方</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">iq&nbsp;</span><span style="color: #ff0000">to</span><span style="color: #0000ff">="android@192.168.1.113/Spark&nbsp;2.6.3"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="set"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="iq_19"</span><span style="color: #ff0000">&nbsp;from</span><span style="color: #0000ff">="iphone@192.168.1.113/xiff"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">query&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://jabber.org/protocol/bytestreams"</span><span style="color: #ff0000">&nbsp;mode</span><span style="color: #0000ff">="tcp"</span><span style="color: #ff0000">&nbsp;sid</span><span style="color: #0000ff">="82B0C697-C1DE-93F9-103E-481C8E7A3BD8"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">streamhost&nbsp;</span><span style="color: #ff0000">port</span><span style="color: #0000ff">="7777"</span><span style="color: #ff0000">&nbsp;host</span><span style="color: #0000ff">="192.168.1.113"</span><span style="color: #ff0000">&nbsp;jid</span><span style="color: #0000ff">="proxy.192.168.1.113"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">query</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">iq</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>&nbsp;</p>
<p>然后就进入连接阶段，也就是初始方和目标方分别和代理建立socks5连接的过程。（关于SOCKS5协议连接，我之后会补充）。<br />目标方收到代理信息后和代理建立socket连接(使用SOCKS5协议连接)，连接成功后通知初始方使用的代理jid</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">iq&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="iq_19"</span><span style="color: #ff0000">&nbsp;to</span><span style="color: #0000ff">="iphone@192.168.1.113/xiff"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="result"</span><span style="color: #ff0000">&nbsp;from</span><span style="color: #0000ff">="android@192.168.1.113/Spark&nbsp;2.6.3"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">query&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://jabber.org/protocol/bytestreams"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">streamhost-used&nbsp;</span><span style="color: #ff0000">jid</span><span style="color: #0000ff">="proxy.192.168.1.113"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">query</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">iq</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>&nbsp;<br />初始方开始与代理建立socket连接(也使用SOCKS5协议)，连接成功后给代理发送请求，要求激活文件流</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">iq&nbsp;</span><span style="color: #ff0000">to</span><span style="color: #0000ff">="proxy.192.168.1.113"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="set"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="iq_21"</span><span style="color: #ff0000">&nbsp;from</span><span style="color: #0000ff">="iphone@192.168.1.113/xiff"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">query&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://jabber.org/protocol/bytestreams"</span><span style="color: #ff0000">&nbsp;sid</span><span style="color: #0000ff">="82B0C697-C1DE-93F9-103E-481C8E7A3BD8"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">activate</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">android@192.168.1.113/Spark&nbsp;2.6.3</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">activate</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">query</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">iq</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>&nbsp;<br />代理回复激活成功信息</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">iq&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="result"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="iq_21"</span><span style="color: #ff0000">&nbsp;from</span><span style="color: #0000ff">="proxy.192.168.1.113"</span><span style="color: #ff0000">&nbsp;to</span><span style="color: #0000ff">="iphone@192.168.1.113/xiff"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>初始方收到回复信息后就进入二进制流传输阶段，这时就可以开始发送二进制流了</p>
<p>等初始方将流发送完毕后把socket流关闭传输就完成了文件的传输。</p>
<p>&nbsp;</p>
<p><font style="font-family: " color="#ff0000">注意：type为result的回复信息使用的id一定要和请求的信息id一样。</font></p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/wkkyo/aggbug/369827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wkkyo/" target="_blank">wkkyo</a> 2012-02-13 00:55 <a href="http://www.blogjava.net/wkkyo/archive/2012/02/13/369827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>