<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[vkill'blog 何永鹏]]></title> 
<link>http://blog.vkill.net/index.php</link> 
<description><![CDATA[]]></description> 
<language>en-US</language> 
<copyright><![CDATA[vkill'blog 何永鹏]]></copyright>
<item>
<link>http://blog.vkill.net/read.php/134.htm</link>
<title><![CDATA[ruby download progress 2]]></title> 
<author>vkill &lt;vkill.net@gmail.com&gt;</author>
<category><![CDATA[ruby &amp; rails]]></category>
<pubDate>Sat, 27 Jun 2009 00:50:09 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/134.htm</guid> 
<description>
<![CDATA[ 
	bjsh给我写了个python的，我看了下原理，又去看看了socket编程，自己用ruby写了个雏形，还有未考虑到的，以后完善<br/>用 socket ，比分片下载好很多<br/><br/><div class="code"><br/>#!/usr/bin/env ruby<br/>#<br/># ruby Download progress 2<br/># by:vkill&nbsp;&nbsp;&nbsp;&nbsp; last change:28/6/2009<br/># Usage: *.rb http://xxx.net/xxx.xxx<br/>#<br/>require &#039;socket&#039;<br/>require &#039;uri&#039;<br/><br/>RECV_DATA_LEN = 1024<br/>have_read = 0<br/>url = ($*&#91;0&#93;&#124;&#124;&quot;http://avira.vkill.net/upd/vdf/antivir3.vdf.gz&quot;)<br/><br/>u = URI.parse(url)<br/>fileName = File.basename(u.path)<br/><br/>begin<br/>&nbsp;&nbsp;$s = TCPsocket.new(u.host,u.port)<br/>rescue<br/>&nbsp;&nbsp;puts &quot;create socket Err, #&#123;$!&#125;&quot;<br/>&nbsp;&nbsp;exit<br/>end<br/><br/>downing = Thread.new &#123;<br/>&nbsp;&nbsp;header = &#123;&quot;User-Agent&quot; =&gt; &quot;antivir-ruby&quot;&#125;<br/>&nbsp;&nbsp;req = &quot;GET &quot;+url+&quot; HTTP/1.0&#92;r&#92;n&quot;<br/>&nbsp;&nbsp;header.each do &#124;k,v&#124;<br/>&nbsp;&nbsp;&nbsp;&nbsp;req += k+&quot;:&quot;+v+&quot;&#92;r&#92;n&quot;<br/>&nbsp;&nbsp;end<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;$s.write(req+&quot;&#92;r&#92;n&quot;)<br/>&nbsp;&nbsp;rescue<br/>&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;download file Err, #&#123;$!&#125;&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;self.kill<br/>&nbsp;&nbsp;end<br/>&#125;<br/><br/>while downing.status == &quot;run&quot; or downing.status == &quot;sleep&quot; do<br/>&nbsp;&nbsp;#read header<br/>&nbsp;&nbsp;$s.recv(1024).each_line do &#124;d&#124;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if $dataStart<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;have_read += d.length<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$f.write(d)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (/^HTTP&#92;//i =~ d) != nil<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$statu = d.split(&quot; &quot;)&#91;1&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not /^(200)$/ =~ $statu<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;download file Err, statu #&#123;$statu&#125;&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;downing.kill<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (/^Content-Length:&#91;&#92;t &#93;*&#91;&#92;d&#93;+&#91;&#92;r&#92;n&#93;*$/i =~ d) != nil<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$totalLength = d.gsub(/.*:&#91;&#92;t &#93;*/,&quot;&quot;).to_i<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (/^&#91;&#92;r&#92;n&#93;*$/ =~ d) != nil<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$dataStart = true<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$f = File.new(fileName, &quot;wb+&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;end<br/>&nbsp;&nbsp;if not $dataStart<br/>&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;download file Err, parser httpHeader error&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;downing.kill<br/>&nbsp;&nbsp;&nbsp;&nbsp;exit<br/>&nbsp;&nbsp;end<br/>&nbsp;&nbsp;$totalLength &#124;&#124;= 1<br/><br/>&nbsp;&nbsp;#read data<br/>&nbsp;&nbsp;while true<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf &quot;&#92;rdowning #&#123;fileName&#125;...&#91;#&#123;$totalLength&#125;bytes&#93; #&#123;(have_read*100) / $totalLength&#125;%&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp = $s.recv(RECV_DATA_LEN)<br/>&nbsp;&nbsp;&nbsp;&nbsp;rescue<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;download file Err, #&#123;$!&#125;&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;downing.kill<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;if resp == &quot;&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf &quot;&#92;rdowning #&#123;fileName&#125;...&#91;#&#123;$totalLength&#125;bytes&#93; 100%&#92;n&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;have_read += resp.length<br/>&nbsp;&nbsp;&nbsp;&nbsp;$f.write(resp)<br/>&nbsp;&nbsp;end<br/>end<br/><br/>$f.close()<br/><br/>case downing.status<br/>&nbsp;&nbsp;when false<br/>&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;downing normally quit&quot;<br/>&nbsp;&nbsp;when nil<br/>&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;downing unnormally quit&quot;<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;puts &quot;downing nuknow quit&quot;<br/>end<br/></div><br/><br/><br/>bjsh写的python的<br/><div class="code"><br/>import socket<br/><br/>READ_ONCE_SIZE = 512<br/>have_read = 0<br/><br/>fd = open(&quot;c:&#92;&#92;test.rar&quot;, &quot;wb&quot;)<br/><br/>s = socket.socket()<br/>s.connect((&quot;blog.vkill.net&quot;, 80))<br/>s.sendall(&quot;GET http://blog.vkill.net/attachment/1221875343_6600827a.rar HTTP/1.0&#92;n&#92;n&quot;)<br/><br/><br/>content = s.recv(READ_ONCE_SIZE)<br/><br/>while True:<br/>&nbsp;&nbsp;&nbsp;&nbsp;start = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;start = content.find(&#039;&#92;n&#039;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;if content&#91;start+1&#93; == &#039;&#92;n&#039;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content = content&#91;start+2:&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if content&#91;start+1&#93; == &#039;&#92;r&#039; and content&#91;start+2&#93; == &#039;&#92;n&#039;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content = content&#91;start+3:&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if content.startswith(&quot;Content-Length&quot;):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;totalLength = int(content&#91;:start&#93;.split()&#91;1&#93;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;content = content&#91;start+1:&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>have_read += len(content)<br/><br/>fd.write(content)<br/><br/>while True:<br/>&nbsp;&nbsp;&nbsp;&nbsp;print &quot;&#92;rtest.rar.....%d&#92;t&#92;t%5d%%&quot; % (totalLength, have_read*100/totalLength),<br/>&nbsp;&nbsp;&nbsp;&nbsp;content = s.recv(READ_ONCE_SIZE)<br/>&nbsp;&nbsp;&nbsp;&nbsp;if not content:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;&#92;rtest.rar.....%d&#92;t&#92;t%5d%%&#92;n&quot; % (totalLength, 100),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break<br/>&nbsp;&nbsp;&nbsp;&nbsp;fd.write(content)<br/>&nbsp;&nbsp;&nbsp;&nbsp;have_read += len(content)<br/><br/>fd.close()<br/><br/></div><br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%258D%258F%25E8%25AE%25AE/" rel="tag">协议</a> , <a href="http://blog.vkill.net/go.php/tags/socket/" rel="tag">socket</a>
]]>
</description>
</item>
</channel>
</rss>