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的值设置到相应的位置,这样我们就可以断点下载了。
如果你是网络编程的新手,那么本文的内容不适合你,因为文中涉及大量的网络编程的概念,你需要去一一掌握然后才能理解本文;如果你是有网络编程的经验,而且不知道这种断点下载的方式,那么我相信你一定学到了!
C#实现http断点下载的更多相关文章
- Java实现多线程断点下载(下载过程中可以暂停)
线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配. ...
- 安卓(android)之实现断点下载功能
一.建立实体类 1.文件实体类 package com.example.zjw.myapplication.dao; import java.io.Serializable; /** * 预下载文件实 ...
- iOS 大文件断点下载
iOS 在下载大文件的时候,可能会因为网络或者人为等原因,使得下载中断,那么如何能够进行断点下载呢? // resumeData的文件路径 #define XMGResumeDataFile [[NS ...
- 【Java EE 学习 22 下】【单线程下载】【单线程断点下载】【多线程下载】
一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-downl ...
- IOS 断点下载
// // ViewController.m // UI4_断点下载 // // Created by qianfeng on 15/8/19. // Copyright (c) 2015年 ZBC. ...
- .net网站的文件上传读取进度条和断点下载
文件上传到服务器时的进度读取 //调整上传配置 AdapterInfo(info); UpfileResult result = new UpfileResult(); try { //直接使用req ...
- iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充
一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...
- unity3d 关于断点下载和整个下载(用于更新)
转自:http://blog.csdn.net/yutyliu/article/details/24346459 string t = ""; //整体下载 IEnumerator ...
- iOS开发网络篇—大文件的多线程断点下载
http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时 ...
- iOS开发网络请求——大文件的多线程断点下载
iOS开发中网络请求技术已经是移动app必备技术,而网络中文件传输就是其中重点了.网络文件传输对移动客户端而言主要分为文件的上传和下载.作为开发者从技术角度会将文件分为小文件和大文件.小文件因为文件大 ...
随机推荐
- SEO优化技巧总结
SEO优化技巧总结 一:了解搜索引擎 基础知识 搜索引擎:由蜘蛛程序沿着链接爬行和抓取网上的大量页面,存进数据库,经过预处理,用户在搜索框 输入关键词后,搜索引擎排序从数据库中挑选出符合搜索关键词要求 ...
- wcf使用ssl连接方式设置
A.makecert -sr localmachine -ss My -n CN=TopupProxyServer -sky exchange -pe -r B.检索证书的指纹 ,证书名TopupPr ...
- 使用timer定时器,防止事件重入
首先简单介绍一下timer,这里所说的timer是指的System.Timers.timer,顾名思义,就是可以在指定的间隔是引发事件.官方介绍在这里,摘抄如下: 1 2 Timer 组件是基于服务器 ...
- .Net_把文件数据添加到数据库中(面试题)
一个文本文件含有如下内容: 4580616022644994|3000|赵涛 4580616022645017|6000|张屹 4580616022645090|3200|郑欣夏 上述文件每行为一个转 ...
- mongoDB7--游标cursor
之前我们学习了"增删改查"四中语法和查询表达式的深入学习,我们已经掌握了一定的操作mongodb数据的能力,那么接下来我们就要考虑我们的操作的效率问题了.(1)游标介绍如果我们查询 ...
- maven依赖本地宝
http://www.mamicode.com/info-detail-169419.html 引用本地的jar包
- Xcode8.2 继续使用插件
网上参考了文章:http://www.jianshu.com/p/ab819babf2c3 使用的是:update_xcode_plugins . 但要注意的是,在Xcode 8.2下安装,并没有给我 ...
- nginx源码学习资源
http://www.cnblogs.com/yjf512/archive/2012/06/13/2548515.html nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源 ...
- TD8.0迁移到QC9.2,自动迁移失败,手动迁移
源机器A:TD8.0+SQLServer2000目标机器B:QC9.2+SQLServer2000 一:自动迁移,1.在A在A上安装QC迁移工具,然后在B中点击TOOLS>>Migrati ...
- 如何将excel导入到数据库中并在gridview中显示
在页面上导入个excel文件,将该excel中的数据导入到数据库中,并且在页面的gridview中把数据显示出来. .在Asp.net中怎样将Excel文件中的数据导入到GridView中呢? 首先我 ...