断点续传

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

原理:断点续传目前比较通用的是使用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. 导入另一个 Git库到现有的Git库并保留提交记录

    在要合并到的目标git仓库,执行 "git pull  远程分支地址/本地git仓库根目录"

  2. 获取元素的最终background-color

    一.题目  用JS代码求出页面上一个元素的最终的background-color,不考虑IE浏览器,不考虑元素float情况.(题目copy自网上) 二.题目解析  1.考察底层JavaScript基 ...

  3. 简述 Spring Cloud 是什么1

    很多同学都了解了Spring ,了解了 Spring Boot, 但对于 Spring Cloud 是什么还是比较懵逼的. 本文带你简单的了解下,什么是Spring Cloud. Spring Clo ...

  4. python第三十六天-----类中的特殊成员方法

    __doc__ 查看尖的描述信息 __module__表示当前操作的对象所在的模块 __class__表示当前操作的对象所属的类 __init__构造方法 通过类创建对象自动执行 __del__析构方 ...

  5. git命令设置简写(别名)

    ### git命令设置简写(别名) 前言:有时候在执行git命令比较多的情况下,每次敲git命令比较费时,同时有些命令比如cherry-pick这种比较长时更是费时,所以可以通过设置命令行简写来设置. ...

  6. windows服务器设置文件属性设置去掉隐藏已知文件类型的扩展名(即文件后缀名可见)

    摘要: 1.文件后缀名不可见,系统运维过程容易发生同名不同后缀的文件操作混淆的情况 2.windows系统默认是文件后缀名不可见 3.所以需要更改一下配置. 4.操作步骤如下图: (1)点击组织-文件 ...

  7. 初识Python - Python的历史(转)

    声明: 本文转自维基百科 如有意见请联系删除 综述 该编程语言 的Python是在20世纪80年代末的设想,和实施是在1989年12月开始由吉多·范罗苏姆在CWI在荷兰的继任者农行能够异常处理,并与接 ...

  8. 计算机基础-BIOS

    BIOS--硬件和软件的纽带(Basic Input Output System) 1.含义:基本的输入输出系统,它是一组固化到计算机内主板上的一个ROM存储芯片上的程序 2.性质:它保存着计算机最重 ...

  9. [经验总结] 在 windows 命令窗口中运行 python 脚本时提示 ModuleNotFoundError: No module named 'xxx'

    先给出的代码和目录结构 获取CPU代码如下: # -*- coding:utf-8 -*- ''' Created on Sep 10, 2018 @author: ''' import sys im ...

  10. python第四十九课——对象序列化与反序列化

    person.py class Person: def __init__(self,*args,**kwargs): print('我是Person类的构造...') # self.name=name ...