博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.net断点续传的原理
阅读量:6901 次
发布时间:2019-06-27

本文共 3961 字,大约阅读时间需要 13 分钟。

在了解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

 

JFIF H H   nbsp;C [1]

….

 

下面我们就来说说“断点续传”。

顾名思义,断点续传就是在上一次下载时断开的位置开始继续。在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 FRAMEWORK中为我们提供了哪些类可以来做这些事。

完成HTTP请求

System.Net.HttpWebRequest

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

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

完成文件访问

System.IO.FileStream

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

 

代码实现

了解了.NET提供的相关的类,那么,我们就可以方便的实现了。http://hovertree.com/menu/dotnet/

代码如下:

 

static void Main(string[] args)              {                                          string StrFileName="c://aa.zip";      //根据实际情况设置                     string StrUrl="http://www.xxxx.cn/xxxxx.zip";   //根据实际情况设置 /* 何问起 hovertree.com */                     //打开上次下载的文件或新建文件                     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/roucheng/p/csxuchuan.html

你可能感兴趣的文章
完成个人中心 导航标签
查看>>
使用位生成子集
查看>>
需求分析--12章 过程建模
查看>>
C#运用实例.读取csv里面的词条,对每一个词条抓取百度百科相关资料,然后存取到数据库...
查看>>
css3选择器
查看>>
nginx虚拟主机配置
查看>>
PYthon基础
查看>>
delphi 把一个表的内容转到另一个表暂存时出错的解决方法。
查看>>
Android Studio 使用笔记:[转] Mac下修改Android Studio 所用的JDK版本
查看>>
《陶哲轩实分析》习题10.4.1
查看>>
【转载】浅析java中的语法糖
查看>>
Windows API 第21篇 DeleteVolumeMountPoint 删除挂载点
查看>>
CSS一些解决办法收集整理
查看>>
关于对char类型数据赋予负值的汇编表现
查看>>
润乾报表在proxool应用下的数据源配置
查看>>
DATABASE
查看>>
Python基础23_os,sys,序列化,pickle,json
查看>>
python MVC、MTV 框架介绍 Django 模板系统常用语法
查看>>
Day06
查看>>
C语言结构体在内存中的存储情况探究------内存对齐
查看>>