frombegintoend原文HTTP断点续传下载的原理

要实现断点续传下载文件,首先要了解断点续传的原理。断点续传其实就是在上一次下载断开的位置开始继续下载,HTTP协议中,可以在请求报文头中加入Range段,来表示客户机希望从何处继续下载。

这是一个普通的下载请求:

GET /test.txt HTTP/1.1
Accept:*/*
Referer:http://192.168.1.96
Accept-Language:zh-cn
Accept-Encoding:gzip,deflate
User-Agent:Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.2;.NET CLR 2.0.50727)
Host:192.168.1.96
Connection:Keep-Alive

这表示从1024字节开始断点续传(加入了Range:bytes=1024-):

GET /test.txt HTTP/1.1
Accept:*/*
Referer:http://192.168.1.96
Accept-Language:zh-cn
Accept-Encoding:gzip,deflate
User-Agent:Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.2;.NET CLR 2.0.50727)
Host:192.168.1.96
Range:bytes=1024-
Connection:Keep-Alive

C#主要代码:

#region 以断点续传方式下载文件  

/// <summary>
/// 以断点续传方式下载文件
/// </summary>
/// <param name="strFileName">下载文件的保存路径</param>
/// <param name="strUrl">文件下载地址</param>
public void DownloadFile(string strFileName, string strUrl)
{
//打开上次下载的文件或新建文件
long SPosition = 0;
FileStream FStream;
if (File.Exists(strFileName))
{
FStream = File.OpenWrite(strFileName);
SPosition = FStream.Length;
FStream.Seek(SPosition, SeekOrigin.Current);//移动文件流中的当前指针
}
else
{
FStream = new FileStream(strFileName, FileMode.Create);
SPosition = 0;
}
try
{
HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(strUrl);
if (SPosition > 0)
myRequest.AddRange((int)SPosition);//设置Range值
//向服务器请求,获得服务器的回应数据流
Stream myStream = myRequest.GetResponse().GetResponseStream();
byte[] btContent = new byte[512];
int intSize = 0;
intSize = myStream.Read(btContent, 0, 512);
while (intSize > 0)
{
FStream.Write(btContent, 0, intSize);
intSize = myStream.Read(btContent, 0, 512);
}
FStream.Close();
myStream.Close();
//文件下载完成
}
catch
{
FStream.Close();
}
} #endregion

HTTP断点续传下载的原理的更多相关文章

  1. 实现android支持多线程断点续传下载器功能

    多线程断点下载流程图: 多线程断点续传下载原理介绍: 在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度手机端下载数据时难免会出现无信号断线.电量不足等情况,所以需要断点续传功能根据下 ...

  2. android 多线程断点续传下载

    今天跟大家一起分享下Android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的,前面2次总结中已经为大家分享过有关技术的一些基 ...

  3. ASP.NET WebAPi之断点续传下载(下)

    前言 上一篇我们穿插了C#的内容,本篇我们继续来讲讲webapi中断点续传的其他情况以及利用webclient来实现断点续传,至此关于webapi断点续传下载以及上传内容都已经全部完结,一直嚷嚷着把S ...

  4. ASP.NET WebAPi之断点续传下载(上)

    前言 之前一直感觉断点续传比较神秘,于是想去一探究竟,不知从何入手,以为就写写逻辑就行,结果搜索一番,还得了解相关http协议知识,又花了许久功夫去看http协议中有关断点续传知识,有时候发觉东西只有 ...

  5. iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>

    前言:根据前篇<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>或者<iOS开发之网络编程--3.NSURLSessionDataTask实现文 ...

  6. iOS开发之网络编程--3、NSURLSessionDataTask实现文件下载(离线断点续传下载)

    前言:使用NSURLSessionDownloadTask满足不这个需要离线断点续传的下载需求,所以这里就需要使用NSURLSessionDataTask的代理方法来处理下载大文件,并且实现离线断点续 ...

  7. iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

    前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但 ...

  8. Android实现网络多线程断点续传下载(转)

    本示例介绍在Android平台下通过HTTP协议实现断点续传下载. 我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多 ...

  9. Android开发多线程断点续传下载器

    使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线.电量不足等情况下,这就需要使用到断点 ...

随机推荐

  1. nodejs调用百度统计api摆脱人肉数据统计

    var http = require("https"); var url = require('url'); var postData = JSON.stringify( { &q ...

  2. apk系统签名命令

    java -jar signapk.jar platform.x509.pem platform.pk8 D:/ClockSetting.apk D:/ClockSettingSigned.apk 需 ...

  3. Hadoop2.x下安装HBase

    1.安装好 hadoop 集群,并启动 [grid@hadoop4 ~]$ /sbin/start-dfs.sh [grid@hadoop4 ~]$ /sbin/start-yarn.sh 查看 ha ...

  4. Javascrpt 速成篇】 二:js面向对象

    现实世界的对象由形态和行为组成,js中对应的是属性和函数. <!DOCTYPE html> <html> <head> <meta charset=" ...

  5. VC dimension and Model complexity

    可以把growth function m_H(N)的upper bound用N^(k-1)来限制, for N large, k>=3 Thus, 定义: VC Dimension: maxim ...

  6. hdu1575 Tr A 矩阵初识

    A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973.  Input数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n(2 <= n <= ...

  7. BZOJ1336 Balkan2002 Alien最小圆覆盖 【随机增量法】*

    BZOJ1336 Balkan2002 Alien最小圆覆盖 Description 给出N个点,让你画一个最小的包含所有点的圆. Input 先给出点的个数N,2<=N<=100000, ...

  8. win32 去掉窗口边框

    参考:http://www.blitzbasic.com/Community/posts.php?topic=67222 Strict Graphics 320, 200 SetClsColor 0, ...

  9. drill 试用

    1. 下载 http://drill.apache.org/ 2. 启动本地模式 bin/sqlline -u jdbc:drill:zk=local 3. 查询数据 select c.r_name ...

  10. caddy server 默认https && http2的验证

    1. 下载     https://caddyserver.com/   注意选择应该包含的模块,此次包含了git 插件   2. 配置    使用 Caddyfile    内容如下:     ro ...