我们寄希望于万能的解决方案,但是现实的情况总是很糟糕。在软件编程的世界中,技术分散的情况尤为严重,且不说各种语言拥有的优势不能融合,单就一门语言而言,就拥有众多的技术和相关技术需要学习。网络编程就是这种情况,tcp、udp、http和soap相关的协议(ftp不会玩),我们不得不在同一个应用中使用不同难以整合的技术。tcp讲究精准,udp讲究性能,http对于穿越外网有这天然的优势,soap对于讲究编程模型的人来说是福音。

其实断点续传,众多技术都可以实现,只是想难易程度而以。经过比较分析发现,http对于断点下载比较容易实现,它最成功的地方在于,不需要服务端的实现,只需将需要下载的文件放置在iis服务器中即可。

下面我会根据下面一段代码分析http协议的

/// <summary>
        /// 下载方法
        /// </summary>
        /// <param name="uri">下载地址的URI</param>
        public void DownLoad(object obj)
        {

//比如uri=http://localhost/Rabom/1.rar;iis就需要自己配置了。
            string uri = obj.ToString();
            //截取文件名
            string fileName = uri.Substring(uri.LastIndexOf(@"/") + 1);

//构造文件完全限定名,准备将网络流下载为本地文件
            string fileFullName = Application.StartupPath + @"\download\" + fileName;
            //构造文件的配置文件的完全完全限定名
            string fileCfgName = Application.StartupPath + @"\download\" + fileName+".cfg";

//本地构造文件流
            FileStream fs;
            //本地配置文件流
            FileStream fsCfg;

if (File.Exists(fileFullName))
            {
                //如果存在配置文件,则继续下载
                if (File.Exists(fileCfgName))
                {
                    fs = new FileStream(fileFullName, FileMode.Append, FileAccess.Write, FileShare.Write);
                    fsCfg = fs = new FileStream(fileFullName, FileMode.Append, FileAccess.Write, FileShare.Write);
                }
                else
                {
                    return;//暂且这样
                }
            }
            else
            {
                fs = new FileStream(fileFullName, FileMode.Create);
                fsCfg = new FileStream(fileCfgName, FileMode.Create);
            }

//开辟内存空间
            byte[] buffer = new byte[512];

//请求地址
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
            //请求开始位置
            request.AddRange((int)fs.Length);

//获取网络流
            Stream ns = request.GetResponse().GetResponseStream();

//获取文件实际长度
            long contentLength = request.GetResponse().ContentLength;
            //获取文件读取到的长度
            int length = ns.Read(buffer, 0, buffer.Length);

while (length > 0)
            {

//将字节数组写入流
                fs.Write(buffer, 0, buffer.Length);

//继续下载
                buffer = new byte[512];
                length = ns.Read(buffer, 0, buffer.Length);
            }

ns.Close();
            fs.Close();
            fsCfg.Close();

}

在上面的代码中,比较重要的就是类HttpWebRequest,这个类封装了http协议访问网络资源的方法,与WebClient不同的是,HttpWebRequest允许我们使用网络流的方式进行下载,我们通过URI创建一个网络

流,我们就可以开始获取我们需要的数据了。在http协议的报文中,会进行详细的描述,当然描述的内容

很多,HttpWebRequest都帮我们做了,说点题外话,http协议会将我们计算机环境写进报文,其中包括计算机

名,计算机所在的ip地址。当然也包括我们所讲的断点下载的关键报文Range,这个报文就是我们需要开始下载文件的起始位置,这样我们就可以根据本地文件已经下载了多少,为断点下载时所要求的起始位置提供依据。

本地文件刚创建的时候,fs.Lenght为0所以我们在iis服务器上请求的网络流的游标是在流的起始位置,

当我们停止下载后,再度下载该资源的时候,网络流的游标位置会根据range的值设置到相应的位置,这样我们就可以断点下载了。

如果你是网络编程的新手,那么本文的内容不适合你,因为文中涉及大量的网络编程的概念,你需要去一一掌握然后才能理解本文;如果你是有网络编程的经验,而且不知道这种断点下载的方式,那么我相信你一定学到了!

转载于:https://www.cnblogs.com/dogxuefeng/p/4527396.html

C#实现http断点下载相关推荐

  1. iOS网络-NSURLSessionDataTask大文件离线断点下载

    什么叫离线断点下载,就是用户下载中关闭程序重新打开可以继续下载 代码实现如下: #import "ViewController.h" @interface ViewControll ...

  2. libcurl断点下载遇到的问题

    最近游戏把资源(图片.配置.lua)的加载.更新全部改了 ,加载其实还好,就是不走之前的zip解压方式. 以前的大体流程: 下载 –> 启动 –> 解压 –> 更新 –> 进入 ...

  3. 使用NSURLConnection实现大文件断点下载

    使用NSURLConnection实现大文件断点下载 由于是实现大文件的断点下载,不是下载一般图片什么的.在设计这个类的时候本身就不会考虑把下载的文件缓存到内存中,而是直接写到文件系统. 要实现断点下 ...

  4. Android多线程断点下载

    到华为后,信息管理特别严格,文件不能外发.所以好久都没写博客了,今天周日,老婆非要我学习.就闲来无事,写一篇博客,呵呵-- 前段时间,项目中提到了断点下载apk并静默安装的需求.本打算用应用市场成熟的 ...

  5. iOS开发网络篇—多线程断点下载

    iOS开发网络篇-多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始, ...

  6. 一行代码快速搞定Flowable断点下载(下)

    一行代码快速搞定Flowable断点下载(下) 其实这个主题对应的三篇文章真的真的非常难写,首先是感觉非常多人对于函数式编程不太熟悉,然后又有一些人对于kotlin不太熟悉.这就导致了,写这三篇文章的 ...

  7. 一行代码快速搞定Flowable断点下载(中)

    一行代码快速搞定Flowable断点下载(中) 感觉上一篇家常聊了太多,这一篇就直接进入正题,首先来看一下,通过存储化以及方法拓展技术将mComposableDisposable的相关逻辑也从抽象Ac ...

  8. 一行代码快速搞定Flowable断点下载(上)

    一行代码快速搞定Flowable断点下载(上) 之前我们大致讲了讲,到底怎么完全将disposable相关代码完全隐藏. 然后到了这里,可能有些杠精就会说了,你那个方式,我们不是完全不能拿到Flowa ...

  9. Java多线程断点下载

    多线程下载已经提高了下载的效率,但是当一些特殊情况发生的时候,我们需要对程序进行处理,这样效率会更高.比如,断电断网等造成下载中断,那么我们下一次又要重新开始下载,这样效率底下,所以我们可以考虑使用断 ...

最新文章

  1. 编译linux内核步骤
  2. angularJS 自定义元素和属性
  3. windows netstat 查看端口、进程
  4. 全国教学交流研讨会“教学为本”主题总结
  5. 客户端程序自动更新(升级)的方式
  6. 【报告分享】中美人工智能之比较分析报告.pdf(附下载链接)
  7. 饿了么想解决外卖小哥马路杀手的问题,但用无人机?
  8. linux下安装cudnn
  9. Android 回调接口是啥,回调机制详解(zhuan)
  10. AspNetForum 论坛整改:添加显IP功能及IP所属地
  11. [转]unresolved external symbol _main解决办法
  12. 我的大学生活-4-21-吕家尧
  13. 华为2288服务器怎样查看硬盘,华为RH2288H V2磁盘系统测试_华为 FusionServer RH2288 V2_服务器评测与技术-中关村在线...
  14. 【应用回归分析】一元简单线性回归显著性检验,t检验和F检验统计量抽样分布推导
  15. [英文邮件写作技巧] 表达感谢,提出问题,描述附件
  16. 清华大学计算机系学几年,清华大学16位学霸简历吓坏网友
  17. 解决matplotlib不显示图片
  18. AVR中C语言while语言,AVR单片机汇编语言程序实例
  19. 解决联想拯救者Y9000X触控板失灵问题
  20. 【仓储管理系统需求分析(四)】

热门文章

  1. 计算机的存储系统,全方面、最详细
  2. 送餐机器人被解雇,人工智能“人性”待进化
  3. 7.Redis常用命令:ZSet
  4. Objective-C之成魔之路【16-使用文件】
  5. Android中的复制粘贴
  6. Bootstrap系列 -- 34. 按钮下拉菜单
  7. Node.js的安装
  8. 通过UDP的组播方式收发数据
  9. CLR 4.0 有哪些新东西? -- 类型等价
  10. AJAX是否能够取代桌面应用程序