昨天通过SOCKET能够读取网络中文件的数据了,趁热打铁今天准备实现第二步。读取网络上文件的部分内容。也就是分块读取。令我高兴的是这个问题其实在那篇perl写的HTTP续传的脚本里已经给出答案了。
答案是:
print $socket "Range: bytes=2048-10000\n"; |
对服务器提出Range请求。如果服务器支持部分读取和续传功能的话,就可以从任意起始位置了开始了。昨天还以为要用sysseek那样像操作本地文件的文件指针一样来实现,羞愧。不学无术是不行滴。
在网上搜索的时候看到这样一个的内容:
如果支持部分文件读取的服务器请求成功的话返回的是206。如果不支持那么返回的是200。这是一个很关键的问题,如果是200的话,指针又会移动回文件头来重新读取。
还有个问题就是,请求回来的数据都会带个响应的头。这个一般是怎么处理的呢?稍后搞明白了补充在这里。下面要解决的问题就是如何用多线程的方法来实现分块下载了,不知道这么打开的文件能不能实现多线程的读取。
待续……
~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~~·~·~·~·~·~·~~·~·~·~
(接上面)
头还是比较好处理的,找了找基本就是遵循HTTP的规则,报头的结尾是两个\r\n(也就是\r\n\r\n)。
考虑到不要有些文本文件恰好也包含HTTP的报头而被误处理,那么只对发出请求后接受的第一段数据做识别处理。这样基本就不会对后面产生影响了。
这里顺便补充点其它的内容。
以前在终端输出下载的百分比时总是一个接一个的输出,一屏幕很烦。一直很希望只在屏幕上直接显示一个,位置不变,数字自己动就好了。现在找到方法了:
printf STDERR "已完成%4.2f"."%!"."\b"x(length($percent)+1),$percent; |
还得好好去看看输出部分的内容,以前都不知道还可以这样。。。
by lanmeibanban
2010-08-07
阅读(1340) | 评论(0) | 转发(0) |