HTTP断点续传下载的原理

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
时间: 2024-08-12 09:46:40

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

Android多线程断点续传下载原理及实现

这段时间看了看工作室的工具库的下载组件,发现其存在一些问题: 1.下载核心逻辑有 bug,在暂停下载或下载失败等情况时有概率无法顺利完成下载.2.虽然原来的设计是采用多线程断点续传的设计,但打了一下日志发现其实下载任务都是在同一个线程下串行执行,并没有起到加快下载速度的作用. 考虑到原来的代码并不复杂,因此对这部分下载组件进行了重写.这里记录一下里面的多线程断点续传功能的实现. 请查看完整的PDF版(更多完整项目下载.未完待续.源码.图文知识后续上传github.)可以点击关于我联系我获取完整P

Android多线程断点续传下载

这个月接到一个项目,要写一个像360助手一样的对于软件管理的APP:其中,遇到了一个问题:多线程断点下载 这个 ,由于之前没有写过这方面的应用功能.所以,不免要自学了.然后就在各个昂站上收索并整理了一下.跟大家分享一下,也能加深我在这方面的理解. 什么是多线程下载? 多线程下载其实就是迅雷,BT一些下载原理,通过多个线程同时和服务器连接,那么你就可以榨取到较高的带宽了,大致做法是将文件切割成N块,每块交给单独一个线程去下载,各自下载完成后将文件块组合成一个文件,程序上要完成做切割和组装的小算法

【Android开发经验】关于【多线程断点续传下载】功能的一个简单实现和讲解

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 上班第一天,在技术群里面和大家闲扯,无意中谈到了关于框架的使用,一个同学说为了用xUtils的断线续传下载功能,把整个库引入到了项目中,在google的官方建议中,是非常不建议这种做法的,集合框架虽然把很多功能集成起来,但是代码越多,出现问题的可能越大,而且无形之中增加了APK的大小,因此,得不偿失.所以,这篇文章主要就"断线续传"下载功能,简单的说下思路和代码实现,因为这类代码比较多,所以找了

Android实现网络多线程断点续传下载

本示例介绍在Android平台下通过HTTP协议实现断点续传下载. 我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多线程断点需要什么功能? 1.多线程下载, 2.支持断点. 使用多线程的好处:使用多线程下载会提升文件下载的速度.那么多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度. HttpURLConnection.getContentLength();//获取下载文件的长度 Ra

android 多线程断点续传下载 四 - 仿下载助手

我们先一起简单回顾下它的基本原理. http://blog.csdn.net/shimiso/article/details/6763664  android 多线程断点续传下载 一 http://blog.csdn.net/shimiso/article/details/6763986  android 多线程断点续传下载 二 http://blog.csdn.net/shimiso/article/details/8448544  android 多线程断点续传下载 三 界面效果 线程池 T

Retrofit+Rxjava+SqlBrite+SqlDelight实现多文件断点续传下载

介绍 实现功能: 多文件下载 暂停,开始断点续传 进度回调 sqlite保存下载信息 程序被杀了,重新打开继续断点下载 ... github: https://github.com/tpnet/RetrofitDownloadDemo , 有用可以点个start谢谢 本文需要SqlDelight.SqlBrite.AutoValue的知识.使用的是Rxjava1.2.9版本. 如何实现 看看流程图: 断点续传的原理为: 在请求头添加Range参数,值为bytes=从什么位置开始-. 多文件下载的

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

前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但是用起来也是很方便的.iOS开发用到的输入输出流和在Java中的输入输出流是几乎一样的,本质也是一个意思:将网络返回的数据当做流来处理.    输入输出的理解:输入到哪里?输出到哪里?这个问题不难理解,输入输出是要站着服务器角度来思考的,下面用图来解释:    代码关键词: 1.在接收到响应头的代理

NET WebAPi之断点续传下载1

ASP.NET WebAPi之断点续传下载(上) 前言 之前一直感觉断点续传比较神秘,于是想去一探究竟,不知从何入手,以为就写写逻辑就行,结果搜索一番,还得了解相关http协议知识,又花了许久功夫去看http协议中有关断点续传知识,有时候发觉东西只有当你用到再去看相关内容时才会掌握的更加牢固,理解的更加透彻吧,下面我们首先来补补关于http协议中断点续传的知识. http协议知识恶补 当请求一个html页面时我们会看到请求页面如下: 第一眼看到上面Accept中的参数时我是懵逼的,之前也就看看缓

百度网盘断点续传下载工具IDM

在百度网盘下载文件,其不支持断点续传,利用迅雷等工具下载大文件非常蛋疼,经常到99%不动,只能重新下载,虽说度娘为了防盗链,但也太坑爹了吧!用百度网盘客户端同步时也经常出错,而且看不到同步进度.后来无意间发现: 利用IDM(Internet Download Manager)下载百度网盘文件时可以实现断点续传. 关于IDM(Internet Download Manager)大家一定不陌生,它是一款国外的下载工具: Internet Download Manager的续传功能可以恢复因为断线.网