在了解HTTP断点续传的原理之前,让我们先来了解一下HTTP协议,HTTP协议是一种基于tcp的简单协议,分为请求和回复两种。请求协议是由客户机(浏览器)向服务器(WEB SERVER)提交请求时发送报文的协议。回复协议是由服务器(web server),向客户机(浏览器)回复报文时的协议。请求和回复协议都由头和体组成。头和体之间以一行空行为分隔。

以下是一个请求报文与相应的回复报文的例子:

代码

GET /image/index_r4_c1.jpg HTTP/1.1  
Accept: */*  
Referer: http://192.168.3.120:8080  
Accept-Language: zh-cn  
Accept-Encoding: gzip, deflate  
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)  
Host: 192.168.3.120:8080  
Connection: Keep-Alive

HTTP/1.1 200 OK  
Server: Microsoft-IIS/5.0  
Date: Tue, 24 Jun 2003 05:39:40 GMT  
Content-Type: image/jpeg  
Accept-Ranges: bytes  
Last-Modified: Thu, 23 May 2002 03:05:40 GMT  
ETag: "bec48eb862c21:934"  
Content-Length: 2827

下面我们就来说说"断点续传",顾名思义,断点续传就是在上一次下载时断开的位置开始继续下载。 
在HTTP协议中,可以在请求报文头中加入Range段,来表示客户机希望从何处继续下载。

比如说从第1024字节开始下载,请求报文如下:

代码

GET /image/index_r4_c1.jpg HTTP/1.1  
Accept: */*  
Referer: http://192.168.3.120:8080  
Accept-Language: zh-cn  
Accept-Encoding: gzip, deflate  
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)  
Host: 192.168.3.120:8080  
Range:bytes=1024-  
Connection: Keep-Alive

.NET中的相关类

明白了上面的原理,那么,我们来看看.NET FRAMEWORK中为我们提供了哪些类可以来做这些事。

完成HTTP请求 System.Net.HttpWebRequest

HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。

HttpWebRequest 将发送到 Internet 资源的公共 HTTP 标头值公开为属性,由方法或系统设置。下表包含完整列表。可以将 Headers 属性中的其他标头设置为名称/值对。但是注意,某些公共标头被视为受限制的,它们或者直接由 API公开,或者受到系统保护,不能被更改。Range也属于被保护之列,不过,.NET为开发者提供了更方便的操作,就是 AddRange方法,向请求添加从请求数据的开始处或结束处的特定范围的字节范围标头

完成文件访问 System.IO.FileStream

FileStream 对象支持使用Seek方法对文件进行随机访问, Seek 允许将读取/写入位置移动到文件中的任意位置。这是通过字节偏移参考点参数完成的。字节偏移量是相对于查找参考点而言的,该参考点可以是基础文件的开始、当前位置或结尾,分别由SeekOrigin类的三个属性表示。

代码实现

了解了.NET提供的相关的类,那么,我们就可以方便的实现了。

代码如下:

代码

static void Main(string[] args)
{

string StrFileName = "c:\\aa.zip"; //根据实际情况设置 
    string StrUrl = "http://www.xxxx.cn/xxxxx.zip"; //根据实际情况设置

//打开上次下载的文件或新建文件 
    long lStartPos = 0;
    System.IO.FileStream fs;
    if (System.IO.File.Exists(StrFileName))
    {
        fs = System.IO.File.OpenWrite(StrFileName);
        lStartPos = fs.Length;
        fs.Seek(lStartPos, System.IO.SeekOrigin.Current); //移动文件流中的当前指针 
    }
    else
    {
        fs = new System.IO.FileStream(StrFileName, System.IO.FileMode.Create);
        lStartPos = 0;
    }

//打开网络连接 
    try
    {
        System.Net.HttpWebRequest request = (System.Net.HttpWebRequest) System.Net.HttpWebRequest.Create(StrUrl);
        if (lStartPos > 0)
            request.AddRange((int) lStartPos); //设置Range值

//向服务器请求,获得服务器回应数据流 
        System.IO.Stream ns = request.GetResponse().GetResponseStream();

byte[] nbytes = new byte[512];
        int nReadSize = 0;
        nReadSize = ns.Read(nbytes, 0, 512);
        while (nReadSize > 0)
        {
            fs.Write(nbytes, 0, nReadSize);
            nReadSize = ns.Read(nbytes, 0, 512);
        }
        fs.Close();
        ns.Close();
        Console.WriteLine("下载完成");
    }
    catch (Exception ex)
    {
        fs.Close();
        Console.WriteLine("下载过程中出现错误:" + ex.ToString());
    }
}

转载于:https://www.cnblogs.com/qiantuwuliang/archive/2010/04/15/1712386.html

C#断点续传原理与实现相关推荐

  1. 文件断点续传原理与实现

    文件断点续传原理与实现 在网络状况不好的情况下,对于文件的传输,我们希望能够支持可以每次传部分数据.首先从文件传输协议FTP和TFTP开始分析, FTP是基于TCP的,一般情况下建立两个连接,一个负责 ...

  2. C# 断点续传原理与实现

    在了解HTTP断点续传的原理之前,让我们先来了解一下HTTP协议,HTTP协议是一种基于tcp的简单协议,分为请求和回复两种.请求协议是由 客户机(浏览器)向服务器(WEB SERVER)提交请求时发 ...

  3. java 断点续传 开源_java断点续传原理

    先说说断点续传的原理:这是HTTP 1.1协议的一部分,并不需要客户端特意去做多么复杂的事情.以前我曾经看过一个单位的技术标书,其中有下载的断点续传这一要求,给出的offer居然还挺高的... 简单的 ...

  4. java断点续传原理_很简单的Java断点续传实现原理

    原理解析 在开发当中,"断点续传"这种功能很实用和常见,听上去也是比较有"逼格"的感觉.所以通常我们都有兴趣去研究研究这种功能是如何实现的? 以Java来说,网 ...

  5. FastDFS 设计理念、文件上传、下载、同步、删除和断点续传原理

    一.FastDFS 系统架构和功能原理 1.架构详解 storage server:存储服务器(又称存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上.Storage s ...

  6. java断点续传原理_java 文件断点续传实现原理

    关键字: RandomAccessFile 一.作用: 随机流(RandomAccessFile)不属于IO流,支持对文件的读取和写入随机访问. 二.随机访问文件原理: 首先把随机访问的文件对象看作存 ...

  7. http断点续传原理:http头 Range、Content-Range

    转载自:http://www.liqwei.com/network/protocol/2011/886.shtml 转载自:http://blog.csdn.net/pud_zha/article/d ...

  8. HTTP断点续传原理 状态码206 Partial Content

    HTTP断点续传 断点续传就是从文件上次中断的地方开始重新下载或上传,当下载或上传文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会去重头下载,这样很浪费时间.所以断点续传 ...

  9. Android 断点续传实现原理

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120956134 本文出自[赵彦军的博客] 文章目录 下载原理 断点续传原理 1.j ...

最新文章

  1. 使用SSH命令行远程登录运行在CloudFoundry上的应用
  2. 【.net部署】Server Error in ‘/‘ Application.错误解决方案
  3. centos 7.3 开放端口并对外开放
  4. Microsoft Office SharePoint Server 2007 Starter Page
  5. mac 设计表结构_模具设计丨问题点检表、全套标准件结构分布,值得转发
  6. birt project mysql_eclipse birt如何连接mysql数据库 配置文件
  7. HTML pre元素
  8. 因为这几个TypeScript代码的坏习惯,同事被罚了500块
  9. 有的编译器,for (i=1; i 《 1; i++)会执行循环体
  10. C语言的全局变量和局部变量的作用域
  11. oracle 11.2.0.3.0 client下载,oracle64位客户端 Instant Client
  12. 区块链入局新领域:助推会展产业从信息化向数字化转型!
  13. 爱数私有云盘 AnyShare 部署(一)
  14. IoT原型开发利用现成的单板设计---凯利讯半导体
  15. 快速入门:Slurm资源管理与作业调度系统
  16. 互联网日报 | 腾讯地图上线聚合打车服务;瑞幸咖啡等公司被罚6100万元;中通快递下周二香港上市...
  17. 数据压缩作业:AVI格式文件分析
  18. spring context:property-placeholder无法加载配置文件,导致属性无效
  19. 图片放大模糊怎么办?要想图片无损放大不失真就试试HitPaw Photo Enhancer吧!!!
  20. flex 居中并两端对齐

热门文章

  1. 架构之美阅读笔记之一
  2. 转HTML+CSS总结/深入理解CSS盒子模型
  3. WEB API:语音识别
  4. asp.net 日期转换
  5. Anaconda+vscode+pytorch环境搭建
  6. git推送本地分支到远程分支
  7. 解决 display 和 transition 冲突的问题
  8. Linux中写入ISO镜像
  9. C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质...
  10. 游戏开发Camera之Cinematic Camera-深度