Welcome

首页 / 软件开发 / C# / C#编程总结(十二)断点续传

C#编程总结(十二)断点续传2014-03-20 cnblogs 停留的风我们经常使用下载工具,如bit精灵、迅雷、FlashGet,这些软件都支持断点续传。

断点续传即下载任务暂停后可以继续,而无需重新下载,即下载时需要通知服务器的起始位置。如果 允许多线程进行分片下载,必须提供起始-截止位置。说到底就是可以选择下载某个片段,整个文件的字 节流,可以截取流的片段,也能实现流的累积,最终完成文件下载。

一、原理

在 HTTP/1.1里新增的一个头属性:Range,也是现在众多号称多线程下载工具(如 FlashGet、迅雷 等)实现多线程下载的核心所在。老版本的HTTP协议不支持,所以一些老的服务器还不支持断点续传。

Range(请求参数)

用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:

Range:(unit=first byte pos)-[last byte pos]

例如:Range:100-199,取文件流的100至199之间的字节。

Range:100,取位置为100后的所有字节。如果range 为正值,服务器应该开始发送从指定的 range 参 数到 HTTP 实体中数据的末尾之间的数据。

Range:-99,取开始的100个字节。如果range 为负值,服务器应该开始发送从 HTTP 实体中数据的开 头到指定的 range 参数之间的数据。

Content-Range (响应参数)

用于响应头,指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返 回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。

一般格式:

Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth] 
例如:Content-Range: bytes 1024000-1126399/7421120

HTTP协议:http://www.w3.org/Protocols/rfc2616/rfc2616.html

二、C#中实现

在C#中使用AddRange方法向请求添加指定范围的字节范围标头

System.Net.HttpWebRequest
所有的方法: