问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2023-07-05 15:49

我来回答

1个回答

热心网友 时间:2024-12-13 05:28

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

  断点续传的原理

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

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

  

  GET /image/index_r _c jpg HTTP/ Accept: */* Referer: Accept Language: zh cn Accept Encoding: gzip deflate User Agent: Mozilla/ (patible; MSIE ; Windows NT ; NET CLR ) Host: : Connection: Keep Alive HTTP/ OK Server: Microsoft IIS/ Date: Tue Jun : : GMT Content Type: image/jpeg Accept Ranges: bytes Last Modified: Thu May : : GMT ETag: bec eb c : Content Length: JFIF H H nbsp; C [ ] …

  下面我们就来说说 断点续传

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

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

  

  GET /image/index_r _c jpg HTTP/ Accept: */* Referer: Accept Language: zh cn Accept Encoding: gzip deflate User Agent: Mozilla/ (patible; MSIE ; Windows NT ; NET CLR ) Host: : Range:bytes= 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= ; //根据实际情况设置  //打开上次下载的文件或新建文件  long lStartPos = ;  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 = ;  }  //打开网络连接   try  {  System Net HttpWebRequest request =(System Net HttpWebRequest)System Net HttpWebRequest Create(StrUrl);  if ( lStartPos> )  request AddRange((int)lStartPos); //设置Range值  //向服务器请求 获得服务器回应数据流  System IO Stream ns= request GetResponse() GetResponseStream();  byte[] nbytes = new byte[ ];  int nReadSize= ;  nReadSize=ns Read(nbytes );  while( nReadSize > )  {  fs Write(nbytes nReadSize);  nReadSize=ns Read(nbytes );  }  fs Close();  ns Close();  Console WriteLine( 下载完成 );  }  catch(Exception ex)  {  fs Close();  Console WriteLine( 下载过程中出现错误: +ex ToString());  }  }

lishixin/Article/program/net/201311/13111
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
"多难兴邦"这个词,让我们懂得了什么? uc怎么进入阅读模式 进入阅读模式方法介绍 uc怎么进入小说阅读模式 uc浏览器设置阅读模式-uc浏览器设置阅读模式方法 uc电脑阅读模式怎么设置电脑上UC浏览器的阅读模式怎么打开 微信怎么判断对方把你拉黑并且删除了,还是只是拉黑了? 公司诉讼由哪个法院管辖?公司诉讼管辖确定的理论依据? 笔记本电脑开机无法进入系统笔记本电脑开机后无法进入系统 从深圳到乌镇玩三天,花销最少是多少?越少越好,如果有个计划就更好乐 马上快过年放假了,第一次去见岳父,送茅台好还是五粮液好? 闪婚的弊端有哪些呢? 用Java实现HTTP断点续传功能(2) 大舅去二舅家找三舅说四舅正确答案,谁是小偷,钱是谁的 大舅去二舅家找三舅说四舅被五舅骗去六舅家偷七舅 按到**21*1##打不出去电话,怎么取消? 怎么设置呼叫转移,如何取消? 你大舅对你二舅说你三舅看见你四舅拿你五舅借你六舅的那一百块钱了... "大舅去二舅家 郭红的人物简介 郭红的个人简介 布局氢能产业推动新能源发展 全国首座油氢合建站在广东佛山建成_百度... 广东省有哪些新能源产业 鬼怪围巾尺寸 天猫电商仓库日结工累嘛 电商仓库累还是快递累 今天也在做满分才女 古穿今 小说 百度云。 帝奥微是做什么的 契税和增值税的区别是什么 购买二手房税务局开的增值税普通发票能代表已经交了契税吗 保护环境的插画-那么保护环境的诗歌插画怎么画? 闪婚有什么危害? 晨起尿毒症的四种表现,希望你一个也没有 小说里的故事会成真吗,感觉有些人跟小说里的一样帅 少儿芭蕾舞收费贵不贵? 谁能告诉我一些尿毒症的症状,想了解一下,谢谢。 网游小说可能成真么 芭蕾舞和拉丁舞哪个贵 手淫对种植牙有影响吗,现在一期过了一个月 在濮阳市环境监测公司上班怎么样 现任七武海有谁 北京暖气片厂家有哪些? 乐高出过哪些99元的机械组 穿越火线枪战王者天龙怎么抽 区委办公室有前途吗 新入职公务员,从某区直不强势部门借调到区委办公室,要不要去?_百度知... 办公室的工作有前途吗? 省考公务员区委办公室和检察院两个职位哪个好 县委办公室公务员有前途吗 解放初期的老怀表值钱吗 关于冰雪运动简单的手抄报 简单的手抄报