`
hugh-lin
  • 浏览: 72933 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

[转]使用.NET实现断点续传

阅读更多

断点续传的原理

在了解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中的相关类

明白了上面的原理,那么,我们来看看.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());

                     }

              }

以上是本人在开发中的一点小小体验,希望能与大家分享! :)

分享到:
评论

相关推荐

    使用.NET实现断点续传功能

    断点续传是一种在网络传输过程中非常实用...在提供的"如何使用.NET实现断点续传功能.txt"文件中,可能会详细阐述这些步骤,包括代码示例和可能遇到的问题。建议仔细阅读该文件,以便深入理解并实践断点续传的.NET实现。

    使用.NET实现断点续传

    ### 使用 .NET 实现断点续传 #### HTTP 协议简介 在深入了解如何使用 .NET 实现断点续传之前,我们首先需要对 HTTP 协议有一个基本的认识。HTTP (HyperText Transfer Protocol) 是一种应用层协议,用于从 WWW ...

    【ASP.NET编程知识】.NET或.NET Core Web APi基于tus协议实现断点续传的示例.docx

    本文档提供了一个使用.NET 或.NET Core Web API 实现断点续传的示例。该示例使用tusdotnet 方案,提供了一个基本的 demo,展示如何使用tus 协议实现断点续传。 知识点3:tusdotnet 方案介绍 tusdotnet 是一个基于...

    Asp.net C#断点续传Demo

    在实现断点续传时,需要注意以下安全问题: - 防止恶意攻击,如上传大量小块导致服务器存储空间耗尽。 - 数据一致性,确保所有块都正确上传并能正确合并。 - 用户隐私,确保敏感信息不被泄露。 总结来说,这个Asp...

    .net c# 断点续传的客户端(winform)和服务端(mvc/webapi)实现

    综上所述,这个项目展示了如何在.NET C#环境中实现断点续传,涉及到客户端的WinForm应用设计、文件分块策略、HTTP请求的处理,以及服务器端的MVC/WebAPI服务开发、文件操作和安全控制等关键知识点。理解并掌握这些...

    asp.net大型文件断点续传实例

    以下是实现断点续传的一些关键步骤: 1. **文件分块**:将大型文件分割为多个小块(例如,每个块5MB)。这样,客户端可以一次处理一个块,而不是整个文件。 2. **状态存储**:客户端需要存储每个块的下载或上传...

    Asp.Net远程断点续传[经典]

    - **HTTP响应控制**:通过对HTTP响应的精细控制,实现断点续传的高效通信。 ### 结论 Asp.Net远程断点续传技术是现代Web应用中不可或缺的一部分,尤其在大数据传输场景下。通过细致的代码分析,我们不仅了解了其...

    ASP.NET 断点续传下载服务器实现

    断点续传下载是一种网络下载方式,它允许下载过程中丢失连接或停止后,重新连接时从上次下载断点的地方继续下载文件,从而节省时间和网络流量。这种方式特别适合下载大型文件或经常更新的文件,如电影、音乐、软件、...

    asp.net 断点续传下载

    在 ASP.NET 中实现断点续传下载是一项增强用户体验的功能,特别是对于大文件下载时,用户可以中断并稍后从停止的地方继续下载,而无需重新开始。 断点续传下载的基本原理是通过 HTTP 协议的 Range 请求头来实现。当...

    在ASP.NET中支持断点续传下载大文件(ZT)

    ### 在ASP.NET中实现断点续传下载大文件的关键知识点 #### 一、断点续传的基本原理 断点续传技术允许用户在下载过程中,即使网络连接中断或下载过程被意外终止,也能从上次断开的位置继续下载,而无需重新开始。...

    .net大附件断点续传示例

    实现.NET大附件断点续传主要涉及以下几个关键知识点: 1. **文件分块**:由于大文件无法一次性加载到内存中,我们需要将其分割成多个小块进行操作。每个块都有自己的标识,以便在续传时找到正确的块。 2. **存储元...

    ASP.NET 断点续传(上传)

    ASP.NET 断点续传(上传)是一种在Web环境下实现大文件上传的高效技术,它允许用户在上传过程中暂停并继续上传,而不会丢失已经上传的部分。这种技术尤其适用于网络环境不稳定或者文件体积过大的场景,提高了用户...

    基于c#的webapi断点续传几种方式及webclient断点续传下载.zip

    本资料包“基于C#的WebAPI断点续传几种方式及WebClient断点续传下载.zip”主要探讨了两种在C#环境下实现断点续传的方法:一是通过WebAPI实现服务端的断点续传功能,二是使用WebClient类进行客户端的断点续传下载。...

    C#+MVC ajax+大文件断点续传

    总的来说,"C#+MVC ajax+大文件断点续传"的示例展示了如何结合多种技术实现高效、可靠的文件上传功能。这个示例可以帮助开发者理解如何在实际项目中解决大文件上传的问题,提高用户体验,尤其是在网络环境不稳定的...

    自己收集的多个Java FTP断点续传的例子源码

    用apache的FTP实现断点续传 - janestone的专栏 - 博客频道 - CSDN.NET (2012年5月21日) java实现FTP多线程断点续传,上传下载! - java学习与交流 - j2ee学习网 - j2ee学习网 (2012年5月21日) 用 Java 实现断点续传 ...

    Asp.net(c#)实现多线程断点续传

    提供的代码片段展示了如何使用C#和ASP.NET实现基本的断点续传功能。代码中使用了`FileStream`类来读取文件,通过`Response`对象处理HTTP响应,包括设置内容长度、类型以及范围等信息。特别注意的是,通过`Response....

    VB.net自定义下载类支持断点续传和任务导入

    "黑色影子下载类库"就是这样一个工具,它专为VB.NET设计,提供了丰富的特性,包括断点续传、任务导入、自动重命名以及实时的下载状态显示。这个库使得开发者能够快速集成复杂的下载功能,而无需从零开始编写大量的...

    C#.net 断点续传源程序

    本 Demo 仅仅只是讲解如何实现断点续传 使用: 调试时,设置解决方案为多项目启动,在客户端的文本框中,将服务器的地址填写为调试时的地址(一般可以只修改端口) 本 Demo 的客户端中,一共提供了2个按钮, ...

    Mvc下异步断点续传大文件源码

    这里利用jQuery的相应插件来完成,它的主要功能是将文件分割成N多个小块来批量上传,正好解决了.net上传文件大小问题,只要将块...利用Http头信息的Content-Range来实现断点续传,即解决了性能问题也解决了用户体验。

Global site tag (gtag.js) - Google Analytics