下载策略浅析

Http协议下载文件,常用的功能有如下:
1.下载进度
2.下载速率
3.断点下载
4.断线自动重连
5.重定向
浅显分析下这5种情况下的实现方案,当然,仅讨论单文件单线程下载的情况。

一.下载进度
Http连接成功后,获取报文“Content-Length”字段,可得知该文件的总字节数,通过IO流读取该网络文件的时候,用“读取的字节数”/“总字节数”,即为下载进度。

二.下载速率

下载速度其实计算的是IO流的读取速度,根据策略,每1秒或每几秒计算本地文件的字节增量,得到下载速率值。

三.断点下载
这里需要用到Http的Range请求头,

Range: bytes=start-end

举个例子:\nbytes=10- :没有end,表示第10个字节 - 最后一个字节(包括第10个字节)
bytes=10-20 :表示第10个字节 - 第20个字节(包括第10个和第20个字节)
因此,断点下载的策略就是,断点的时候记录当前文件的字节数,继续下载的时候,设置Range请求头(Range时返回码是206),从该字节位的下一位进行下载,在对本地文件进行追写操作。
一个小细节,字节是从0位开始算起,因为断点下载设置Range:bytes=file.length-

四.断线自动重连
首先怎样确定是断线状态,可以分为2种情况:
1.返回码不为200/206的时,直接判定为断线
2.返回码为200/206时,自定义策略,比如3秒内下载的字节数不超过1byte,则认为断线了,需要尝试重连
重连的办法还是创建新的Http连接,发送请求

五.重定向
当资源被转移了,根据状态码
301 资源永久移动
302 资源临时移动
303 查看另一个资源
307 临时重定向
308 永久重定向
根据返回的报文字段“Location”获取到资源最新的url,然后创建重连下载。