断点续传

最近在优化之前的下载流程,仅此篇幅留作笔记之用,日后其他研究此类问题的伙伴可以马上了解原理和开发,减少开发成本。

原理:断点续传目前比较通用的是使用HTTP续传方式,相关的资料可以通过访问:这边简单的说明下--HTTP是(超文本传输协议),而HTTP又是基于TCP/IP协议之上的协议,好了这边我们不需要了解的太深,知道它是超文本传输协议就好了,即维系(服务器Server)和(客户端Client)之间的传输协议;

思路:通过超链接(可以是你的FTP服务器或者任意的可访问地址)下载然后本地文件根目录(最终目标保存)进行保存。中间的方式采用超文本传输协议(HTTP)完成;

1-首先定义一个临时文件格式PERSIST_EXP,用于保存已经下载的临时文件;

        /// <summary>
/// temporary file byte
/// </summary>
public static string PERSIST_EXP = ".cdel";

2-更新下载的核心方法;

  public void download(string url, string path)
{
if (File.Exists(path))
{
if (MessageBox.Show("文件己存在!是否重新下载?", "Confirm Message", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.OK)
{
File.Delete(path);//先删除后重新下载
ResumeDownload(url, path);
}
else
return;
}
else
{
//续传
ResumeDownload(url, path);
}
}
private void ResumeDownload(string url, string path)
{
path = path + PERSIST_EXP;
simpleDownload(url, path);//开始下载
}

3-续传核心方法:使用HttpWebRequest类从客户端发送URL(这个URL就是服务器地址)给服务器请求响应,然后服务器返回一个Request信息。具体的HttpWebRequest介绍可以访问:https://msdn.microsoft.com/zh-cn/library/system.net.httpwebrequest.aspx。 然后通过WebResponse进行资源的响应获取真正的源信息。接下来就是随心所欲的操作了。

HttpWebRequest request = getWebRequest(url, );

            WebResponse response = null;
response = request.GetResponse();
totalLength = response.ContentLength;
Stream reader = response.GetResponseStream(); await Task.Run(() => UpdateProcess(reader, currentLength, writer, totalLength, path, response));//开辟一条新的进程,用于执行任务,主线程直接结束;

4-通过字节逐个读取并写入临时文件;(其中需要注意的是字节reader对象、writer对象、还有响应的response读取完成之后需要清除和释放)

 private void UpdateProcess(Stream reader, long currentLength, FileStream writer, long totalLength, string path, WebResponse response)
{ byte[] buff = new byte[];
int c = ; //实际读取的字节数
while ((c = reader.Read(buff, , buff.Length)) > )
{
currentLength += c;
writer.Write(buff, , c);
this.Dispatcher.Invoke(() => progressBar(currentLength, totalLength));//进度条
writer.Flush();
}
close(writer);
if (currentLength == totalLength)
{
File.Move(path, path.Replace(PERSIST_EXP, ""));
MessageBox.Show("下载完成!");
}
if (reader != null)
{
reader.Close();
reader.Dispose();
response.Close();
}
}

5- 还未下载完成然后断开,第二次启动的时候就需要检索当前的字节读取范围以及剩下的字节还有多少需要读取,保证读取的完整性;

  request = getWebRequest(url, (int)lStartPos);//设置Range值

                writer.Seek(lStartPos, SeekOrigin.Begin);//指针跳转
response = request.GetResponse(); totalLength = response.ContentLength + lStartPos; //总长度
currentLength = lStartPos; //当前长度

C#断点续传下载。的更多相关文章

  1. ASP.NET WebAPi之断点续传下载(下)

    前言 上一篇我们穿插了C#的内容,本篇我们继续来讲讲webapi中断点续传的其他情况以及利用webclient来实现断点续传,至此关于webapi断点续传下载以及上传内容都已经全部完结,一直嚷嚷着把S ...

  2. ASP.NET WebAPi之断点续传下载(上)

    前言 之前一直感觉断点续传比较神秘,于是想去一探究竟,不知从何入手,以为就写写逻辑就行,结果搜索一番,还得了解相关http协议知识,又花了许久功夫去看http协议中有关断点续传知识,有时候发觉东西只有 ...

  3. iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>

    前言:根据前篇<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>或者<iOS开发之网络编程--3.NSURLSessionDataTask实现文 ...

  4. iOS开发之网络编程--3、NSURLSessionDataTask实现文件下载(离线断点续传下载)

    前言:使用NSURLSessionDownloadTask满足不这个需要离线断点续传的下载需求,所以这里就需要使用NSURLSessionDataTask的代理方法来处理下载大文件,并且实现离线断点续 ...

  5. iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

    前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但 ...

  6. 实现android支持多线程断点续传下载器功能

    多线程断点下载流程图: 多线程断点续传下载原理介绍: 在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度手机端下载数据时难免会出现无信号断线.电量不足等情况,所以需要断点续传功能根据下 ...

  7. Android实现网络多线程断点续传下载(转)

    本示例介绍在Android平台下通过HTTP协议实现断点续传下载. 我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多 ...

  8. android 多线程断点续传下载

    今天跟大家一起分享下Android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的,前面2次总结中已经为大家分享过有关技术的一些基 ...

  9. Android开发多线程断点续传下载器

    使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线.电量不足等情况下,这就需要使用到断点 ...

  10. Android之断点续传下载

    今天学习了Android开发中比较难的一个环节,就是断点续传下载,很多人看到这个标题就感觉头大,的确,如果没有良好的逻辑思维,这块的确很难搞明白.下面我就将自己学到的知识和一些见解写下供那些在这个环节 ...

随机推荐

  1. Java:JDBC的基本使用

    本文内容: 什么是JDBC JDBC的使用 事务 连接池 DbUtils 首发日期:2018-05-27 修改: 2018-07-19:增加了事务.连接池.DBUtils 2018-07-27:对特别 ...

  2. 【js基础】js排序方法——快排+堆排+插排+选择排

    快排 Array.prototype.fastSort = function(){ var arr = this; function sort(left, right, arr){ if( left ...

  3. Spark线性回归实现优化

    import org.apache.log4j.{Level, Logger} import org.apache.spark.ml.feature.VectorAssembler import or ...

  4. sql server2014企业版无人值守批处理脚本自动化安装

    ▲版权声明:本文为博主原创文章,未经博主允许不得转载. SQL Server系列软件是Microsoft 公司推出的关系型数据库管理系统.2014年4月16日于旧金山召开的一场发布会上,微软CEO萨蒂 ...

  5. PHP 服务器及TP5框架遇到的几个错误

    一.Call to undefined function imagecreatefrompng(): LAMP环境搭建的博客,在提交内容的时候TP5框架报了一个错误,Call to undefined ...

  6. HighCharts初测试

    把HighChart嵌入到博客中.  

  7. Linux 小知识翻译 - 「版本号」的命名方式

    包括OS,所有的软件都有版本号信息.一般来说,版本号的增大表示软件的功能增强了或者修正了一些Bug,也就是表示软件更新了. 版本号的命名方式没有统一的标准.每种软件都不一样. 大部分情况下,版本号以「 ...

  8. break和continue语句(初学者)

    1.break语句可以从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句. 一般形式:break: break不能用于循环语句和switch语句之外的任何其他语句中. 注意:(1)break ...

  9. 注册OCX失败/ 找不到指定的模块

    错误信息:模块“*.OCX”加载失败,请确定二进制保存在指定的路径中,或者调试它以检查该二进制或相关的.dll文件是否有问题 对于电脑新手,关于OCX或DLL缺失是一件令人十分头疼的事,如果不幸遇到此 ...

  10. Z30云台PC控制问题

    https://developer.dji.com/cn/onboard-sdk/ 我们的需求: 完成PC程序控制Z30相机云台 关键问题: 前提:遥控器控制飞机+图像观看+调焦 1 PC能够接收到图 ...