.net断点续传的原理

在了解HTTP断点续传的原理之前,先来说说HTTP协议,HTTP协议是一种基于tcp的简单协议,分为请求和回复两种。请求协议是由客户机(浏览器)向服务器(WEBSERVER)提交请求时发送报文的协议

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

在了解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提供的相关的类,那么,我们就可以方便的实现了。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());

                     }

              }

推荐:http://www.cnblogs.com/roucheng/p/netkuangjia.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120363.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • fasterrcnn详解_faster RCNN

    fasterrcnn详解_faster RCNNpaper:FasterR-CNN:TowardsReal-TimeObjectDetectionwithRegionProposalNetworks前言fasterrcnn是何凯明等大神在2015年提出目标检测算法,该算法在2015年的ILSVRV和COCO竞赛中获得多项第一。该算法在fastrcnn基础上提出了RPN候选框生成算法,使得目标检测速度大大提高。RCN…

    2022年10月5日
    0
  • maven 打的包在哪_maven打包流程学习「建议收藏」

    maven 打的包在哪_maven打包流程学习「建议收藏」前言:最近工作中遇到了几次跟maven打包相关的问题,每个问题上网查资料解决都花了不少时间,很影响工作进度。既然遇到好几次,每次都能发现知识盲点,干脆总结整理一下,啃掉这个难啃的骨头。ps:最近看到了一个很有意思句子:因为今天不想跑步,所以才去跑,这是长距离跑者的思维方式。转载:正文:还是首先描述一下最近遇到的几个问题吧:一、初见springboot多模块项目mvn打包遇到的问题-存在依赖但却…

    2022年5月11日
    42
  • 蓝天人眼中的郎凤娥是谁_山西蓝天集团

    蓝天人眼中的郎凤娥是谁_山西蓝天集团蓝天人眼中的郎凤娥,提起郎凤娥,我海中就闪现除了一个忙碌的身影,一个时时刻刻都在为企业未来的发展尽心尽力新女性,这就是郎凤娥。郎凤娥非常看重企业的形象与责任,过去的几年中她曾获得全国三八红旗手、全国五一劳动奖章、全国双学双比女能手、山西省十大女杰、山西省劳动模范、“山西十大杰出女企业家”等等,多的数不过来的荣誉。2011年她还获得了全国资源综合利用年度影响力人物,这让她觉得很欣慰,多年的辛苦没有白…

    2025年6月29日
    4
  • html跳转指定位置(html登录页面跳转到不同页面)

    锚标签和href属性HTML使用(锚)标签来创建连接另一个文档的链接。锚可以指向网络上的任何资源:一张HTML页面,一幅图像,一个声音或视频文件等等。用来创建锚。href属性用于定位需要链接的文档,锚的开始标签和结束标签之间的文字被作为超级链接来显示。锚标签和Name属性Name属性用于创建被命名的锚(namedanchors)。当使用命名锚(name

    2022年4月14日
    180
  • 主成分分析

    主成分分析

    2021年12月17日
    42
  • SecureCRTPortable样式设置

    SecureCRTPortable样式设置SecureCRTPortable高大上设置背景设置进入界面——最上方选项——会话选项——外观,进行如下设置设置完成后就会出现高大上的大神界面

    2022年4月29日
    84

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号