zoukankan      html  css  js  c++  java
  • Winform 实现断点续传的思路及代码

    开篇的絮絮叨叨:
    如果是web,可以考虑使用 使用Web Uploader : http://fex.baidu.com/webuploader/getting-started.html

    工作中需要使用到断点续传,找了好多篇博客,最后的时候在csdn上找到一个项目(文末有链接)。把他的代码拆出来使用了。

    虽然不同的断点续传实现可能不同,不过思路应该都是相似的。

    思路篇:

    1.数据块

    假设一个文件有2G大小,甚至更大,那么我们就需要把他切分成很多片断了。而断的片断,只能使用二进制的方式去切,这里是唯一的。

    使用了二进制去切片,那么传输的时候,也只能使用二进制,那么无论任何语言去实现都需要支持 二进制的提交(post)

    如果只是提交了数据流上去,而服务端没有任何标识信息。服务端也不会知道如何才能把碎片组合成上传的文件。

    所以我们需要有文件的唯一标识(Id),文件块的位置(chunk),标识块的完整码(md5)

    如果我们将所有的数据块都传完整了。那么服务端并不知道,我们有没有传完,所以需要客户端发起一次合并文件的 请求,将所有文件合并

      至此,我们已经把问题拆分的粒度比较小了。

      客户端:一个循环,不断向服务端提交文件片断及附属信息。提交完成后,发起合并请求。

      服务端:两个接口,接口文件片断及附属请求;合并文件流,组合文件

    2.记录方式

     因为可能存在各种各样的原因,导致程序退出。所以下次重传的时候,需要记录程序传输的起始位置。所以这里最好能有数据库之类的来记录

    sqlite是一个小型的数据库,非常方便。只不过并发性不是特别好。

    实现篇:

    具体的客户端的代码,我先帖到这里。

    自己的winform实现

    https://gitee.com/everydaygift/WinFormUploader.git

    其中用了一些第三方的组件:

      easyLiter(Sqlite用来记录上传过的片断)

      log4net用来记录程序的运行状况,打日志方便调试

      csdn的源项目,具体地址:https://download.csdn.net/download/lijiangchxp2005/2585179

    winform的效果如下:

     服务端的代码有一份Python和一份C#的,整理后再发出来。

    扩展篇:

    程序目前还有两点做的不好的:

    1.可以考虑实现多线程上传。

      这里因为考虑到sqlite并发性问题,及多线程复杂的情况。目前时间还没有做

    2.上传后,服务端返回状态码的判断问题

      因为目前只要是上传没有报错,那么就默认上传成功了。而实际上传片断时,可能会存在各种各样的情况,这里还需要调整。

  • 相关阅读:
    关于求 p_i != i and p_i != i+1 的方案数的思考过程
    poj 3041 Asteroids 二分图最小覆盖点
    poj 1325 Machine Schedule 最小顶点覆盖
    poj 1011 Sticks 减枝搜索
    poj 1469 COURSES 最大匹配
    zoj 1516 Uncle Tom's Inherited Land 最大独立边集合(最大匹配)
    Path Cover (路径覆盖)
    hdu 3530 SubSequence TwoPoint单调队列维护最值
    zoj 1654 Place the Rebots 最大独立集转换成二分图最大独立边(最大匹配)
    poj 1466 Girls and Boys 二分图最大独立子集
  • 原文地址:https://www.cnblogs.com/everydaygift/p/9543417.html
Copyright © 2011-2022 走看看