C#实现http协议下载的断点续传

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

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

文章来源:http://blog.sina.com.cn/s/blog_62b0d0ef0100mnmj.html

时间: 2024-08-24 18:25:08

C#实现http协议下载的断点续传的相关文章

【幻化万千戏红尘】qianfengDay27-HttpURLConnection,OkHttpClient,,多线程下载且断点续传基础学习:

课程回顾: Servlet:java语言开发的运行在服务器上的开发步骤:1.创建Servlet类2.重写doGet或doPost方法3.运行在服务器 生命周期:1.初始化2.服务3.销毁 URL:统一资源定位符,网址openConnection 今日内容:Http协议:超文本传输协议常用方式:1.HttpURLConnection2.okHttp HttpURLConnection的使用步骤:1.创建URL对象---URL url=new URL("网址");2.获取连接对象--Htt

Nginx支持用户多线程下载和断点续传

RFC2616规范中定义了range协议,它给出一种规则使得客户端可以再一次请求中只下载完整文件的一部分,这样就支持客户端在开启多线程的同时下载一份文件,其中每个线程仅下载文件的一部分,最后组合成完整的文件,range也支持断点续传,只要客户端记录了已下载部分文件偏移量,就可以要求服务器从断点处发送文件之后的内容. Nginx对range协议支持的非常好,因为range协议主要增加了一些HTTP头部处理流程,以及发送文件时的偏移量处理.Nginx设计了HTTP过滤模块,每个请求可以由许多HTTP

RFC 协议下载方法

rfc的官方网站是:http://tools.ietf.org 举例说明: RFC7230是HTTP 1.1协议,此文档的URL为:http://tools.ietf.org/html/rfc7230 你只要把URL最后的4位数字替换为你要下载的文档的编号就可以打开下载页面了, 在下载页面上提供文档的多种格式以供下载. RFC 协议下载方法,布布扣,bubuko.com

使用HTTP协议下载文件

为了测试方便,在自己的电脑上开一个web服务Tomcat,在Tomcat的webapps文件夹里放测试下载用的文件 在cmd的ipconfig指令下查看自己的主机的IP地址. 之前没有接触过Tomcat,就先按网上介绍的安装教程下载Tomcat,并在Eclipse配置好Tomcat http://blog.chinaunix.net/uid-25434387-id-167705.html 初次安装配置会出现一些错误,但在网上都能找到解决办法,直到Tomcat正常工作 使用HTTP·协议下载文件:

android开发笔记之多线程下载及断点续传

今天我们来接触一下多线程下载,当然也包括断点续传,我们可以看到 很多下载器,当开通会员的时候下载东西的速度就变得快了许多,这是为什么呢?这就是跟今天讲的多线程有关系了,其实就是多开了几个线程一起下载罢了.当然真正的多线程下载要比这个复杂,要考虑很多问题. 做个不恰当的比喻: 假如我们把一个服务器上的文件看作是一个水缸里的水的话,那么多线程下载就相当于从水缸上打了多个小孔,然后塞进去小管道进行抽水.呵呵,也许这个比喻不够准确. 效果: 这里下载的是本地服务器上的文件,你们可以下载网络上的一些文件.

Android开发--多线程下载加断点续传

文件下载在App应用中也用到很多,一般版本更新时多要用的文件下载来进行处理,以前也有看过很多大神有过该方面的博客,今天我也自己来实践一下,写的一般,还请大家多提意见,共同进步.主要思路: 1.多线程下载: 首先通过下载总线程数来划分文件的下载区域:利用int range = fileSize / threadCount:得到每一段下载量:每一段的位置是i * range到(i + 1) * rang  - 1,注意最后一段的位置是到filesize - 1: 通过Http协议的Range字段实现

使用 NSURLSession 开发一个支持后台下载和断点续传的下载工具

NSURLSession 是 iOS 系统提供给我们的原生网络操作库,它提供了网络操作相关的一系列特性支持,比如缓存控制,Cookie管理,HTTP 认证处理等等,是一套整体的网络操作处理解决方案. 关于 NSURLSession 的基本特性,我们之前的一篇文章 NSURLSession 网络库 - 原生系统送给我们的礼物 有过详细的介绍,如果大家之前没有使用过这个库,可以先参考一下这篇内容. 这次我们不介绍任何 NSURLSession 的基础概念,我们将以一个实际的下载工具 APP 开发来实

自己写的一个简单的迅雷下载支持断点续传

当我学习了网络线程,就自己仿照迅雷下载写了一个下载器,支持断点续传 我用的是SWT插件做的界面 界面 package com.yc.xunlei; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.Arra

Android 多线程下载,断点续传,线程池

你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效果图是同时开启三个下载任务,限制下载线程数量的效果图. 多线程下载原理 多线程下载的原理就是将下载任务分割成一个个小片段再将每个小片段分配给各个线程进行下载. 例如一个文件大小为100M,我们决定使用4个线程下载,那么每个线程下载的大小即为25M,每个线程的起始以及结束位置依次如下: 0: 0-25M 1: 25-50M 2: 50-75M 3