.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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • deepfacelab最新版使用教程(deepfacelab训练技巧)

    欢迎进入本教程,本教程不定期更新本文教程内容更新时间为:2019/2,本文最后更新时间为:2019/3/8欢迎进群讨论,我不是群主,群主的各QQ群号码请看:https://deepfakes.com.cn/index.php/资助升级群这几天朱茵换脸杨幂的事件上了热门,我们群不存在该违法问题。然而因为网上的这个事件,2群排队已经可以说排到了明年。群主表示等风波结束了再考虑新群,毕竟群主不想…

  • input只允许上传图片类型文件

    input只允许上传图片类型文件

  • 2187. 星际转移问题(最大流+分层图)「建议收藏」

    2187. 星际转移问题(最大流+分层图)「建议收藏」由于人类对自然资源的消耗,人们意识到大约在 2300 年之后,地球就不能再居住了。于是在月球上建立了新的绿地,以便在需要时移民。令人意想不到的是,2177 年冬由于未知的原因,地球环境发生了连锁崩溃,人类必须在最短的时间内迁往月球。现有 n 个太空站(编号 1∼n)位于地球与月球之间,且有 m 艘公共交通太空船在其间来回穿梭。每个太空站可容纳无限多的人,而每艘太空船 i 只可容纳 H[i] 个人。每艘太空船将周期性地停靠一系列的太空站,例如:(1,3,4) 表示该太空船将周期性地停靠太空站 134

  • Protel 99SE详细安装教程(附安装包)[通俗易懂]

    Protel 99SE详细安装教程(附安装包)[通俗易懂]安装步骤:安装前先关闭杀毒软件和360卫士,注意安装路径不能有中文,安装包路径也不要有中文。安装前请断网。试装系统:win1064bit1.解压安装包。2.以管理员身份运行Protel99SE文件夹里的安装程序。3.点击下一步。4.name和company随便输入,打开SerialNO.txt,将serialNO输入到安装界面的code栏中。5.选择好安装目录(不要出现中…

  • Java内存管理-探索Java中字符串String(十二)

    做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!文章目录一、初识String类二、字符串的不可变性三、字符串常量池和 intern 方法四、面试题1、 String s1 = new String(“hello”);这句话创建了几个字符串对象?2、有时候在面试的时候会遇到这样的问题:**都说String是不可变的,为什么我可以这样做呢,String a = “1”…

  • MySQL主从复制配置[通俗易懂]

    MySQL主从复制配置[通俗易懂]MySQL主从复制及读写分离一、MySQL复制的应用常见场景 读写分离,提高查询访问性能,有效减少主数据库访问压力。 实时灾备,主数据库出现故障时,可快速切换到从数据库。 数据汇总,可将多个主数据库同步汇总到一个数据库中,方便数据统计分析。 二、MySQL主从复制原理介绍1、MySQL异步和半同步复制传统的MySQL复制提供了一种简单的主-从复制方法。有一个主,以及一个或多个从。主节点执行和提交事务,然后将它们(异步地)发送到从节点,以重新…

发表回复

您的电子邮箱地址不会被公开。

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