首页 / C# / C#实现http协议下载的断点续传
C#实现http协议下载的断点续传
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#实现http协议下载的断点续传,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2471字,纯文字阅读大概需要4分钟。
内容图文
![C#实现http协议下载的断点续传](/upload/InfoBanner/zyjiaocheng/1138/135182e2146f4f509e4a21e442b5c1e9.jpg)
我们寄希望于万能的解决方案,但是现实的情况总是很糟糕。在软件编程的世界中,技术分散的情况尤为严重,且不说各种语言拥有的优势不能融合,单就一 门语言而言,就拥有众多的技术和相关技术需要学习。网络编程就是这种情况,tcp、udp、http和soap相关的协议(ftp不会玩),我们不得不在 同一个应用中使用不同难以整合的技术。tcp讲究精准,udp讲究性能,http对于穿越外网有这天然的优势,soap对于讲究编程模型的人来说是福音。
其实断点续传,众多技术都可以实现,只是想难易程度而以。经过比较分析发现,http对于断点下载比较容易实现,它最成功的地方在于,不需要服务端的实现,只需将需要下载的文件放置在iis服务器中即可。
下面我会根据下面一段代码分析http协议的
/// <summary>
/// 下载方法
/// </summary>
/// <param
name="uri">下载地址的URI</param>
publicvoidDownLoad(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
原文:http://www.cnblogs.com/lidj/p/5242305.html
内容总结
以上是互联网集市为您收集整理的C#实现http协议下载的断点续传全部内容,希望文章能够帮你解决C#实现http协议下载的断点续传所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。