我们寄希望于万能的解决方案,但是现实的情况总是很糟糕。在软件编程的世界中,技术分散的情况尤为严重,且不说各种语言拥有的优势不能融合,单就一门语言而言,就拥有众多的技术和相关技术需要学习。网络编程就是这种情况,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的值设置到相应的位置,这样我们就可以断点下载了。

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

C#实现http断点下载的更多相关文章

  1. Java实现多线程断点下载(下载过程中可以暂停)

    线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配. ...

  2. 安卓(android)之实现断点下载功能

    一.建立实体类 1.文件实体类 package com.example.zjw.myapplication.dao; import java.io.Serializable; /** * 预下载文件实 ...

  3. iOS 大文件断点下载

    iOS 在下载大文件的时候,可能会因为网络或者人为等原因,使得下载中断,那么如何能够进行断点下载呢? // resumeData的文件路径 #define XMGResumeDataFile [[NS ...

  4. 【Java EE 学习 22 下】【单线程下载】【单线程断点下载】【多线程下载】

    一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-downl ...

  5. IOS 断点下载

    // // ViewController.m // UI4_断点下载 // // Created by qianfeng on 15/8/19. // Copyright (c) 2015年 ZBC. ...

  6. .net网站的文件上传读取进度条和断点下载

    文件上传到服务器时的进度读取 //调整上传配置 AdapterInfo(info); UpfileResult result = new UpfileResult(); try { //直接使用req ...

  7. iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充

    一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...

  8. unity3d 关于断点下载和整个下载(用于更新)

    转自:http://blog.csdn.net/yutyliu/article/details/24346459 string t = ""; //整体下载 IEnumerator ...

  9. iOS开发网络篇—大文件的多线程断点下载

    http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时 ...

  10. iOS开发网络请求——大文件的多线程断点下载

    iOS开发中网络请求技术已经是移动app必备技术,而网络中文件传输就是其中重点了.网络文件传输对移动客户端而言主要分为文件的上传和下载.作为开发者从技术角度会将文件分为小文件和大文件.小文件因为文件大 ...

随机推荐

  1. uitableview 关于键盘挡住输入框解决方法

    // // AboutKeyBoardEventViewController.m // QueryBussinessInfo // // Created by mac on 16/8/23. // C ...

  2. 搭建Mantis 缺陷管理系统

    什么是Mantis MantisBT is a free popular web-based bugtracking system (feature list). It is written in t ...

  3. python unitest基本

    基本 import unittest class OneTest(unittest.TestCase): def setUp(self): self.verificationErrors = [] s ...

  4. http header cache-control (request和response区别)

    摘要:(1)网络服务会根据 request的header中的 cache-control策略设置response的cache-control策略 1 response cache-control 和 ...

  5. SharePoint2013 Set Value To PeoplePicker

    var columnName = 'Display Name';var userName = 'domain\\name';var searchText = RegExp("FieldNam ...

  6. 在Windows上安装Python

    首先,从官网下载 最新版本 的Python 2.7.可通过 Python官网 的”Windows Installer”链接保证下载到的版本是最新的. Windows版本是MSI文件格式,双击它即可开始 ...

  7. MySQL 出现 The table is full 的解决方法【转】

    [MySQL FAQ]系列 — 你所不知的table is full那些事 时间 2014-08-21 12:18:56  MySQL中文网 原文  http://imysql.com/2014/08 ...

  8. zend笔记

    ZEND_STRL(str)  等价于 (str), (sizeof(str)-1) ZEND_STRS(str)等价于 (str), (sizeof(str))

  9. 关于Select * 与Select 字段名 的问题!

    [转]http://blog.csdn.net/tongyu2009/article/details/8252418 1.SELECT * 语句取出表中的所有字段,不论该字段的数据对调用的应用程序是否 ...

  10. boost ASIO实例

    client端代码 #include <iostream> #include <boost/asio.hpp> #include <boost/bind.hpp> ...