zoukankan      html  css  js  c++  java
  • 断点下载实现

    使用场景

    OTA升级时,下载升级包做了断点下载

    实现方式

    1. 在提供基础http接口的第三方网络通信库,基础上实现断点下载的逻辑
    2. curl库携带了断点续传的功能

    http相关

    request

    Range:告诉服务端从指定位置下载

    一个1000字节的资源,Range可以设置为0~999,0表示第一字节

    Range 的范围格式

    表示0-499个字节范围:Range: bytes=0-499
    表示最后500个字节范围:Range: bytes=-500
    表示500字节开始到结束范围:Range: bytes=500-
    表示第一个和最后一个字节:Range: bytes=0-0,-1
    表示同时指定几个范围:Range: bytes=500-600,601-999
    

    If-Unmodified-Since: (非必须)携带上一次请求时,服务端返回的Last-Modified,如果有更新,则返回412

    If-None-Match: (非必须)携带上一次请求时,服务端返回的ETag,如果不一致,返回304

    response

    code

    code 206: 表示partial content
    code 416: 表示请求范围错误,比如1000字节的资源,Range:bytes=1000-,则返回416
    

    Accept-Ranges: 是否支持断点

    Accept-Ranges: bytes (支持)
    Accept-Ranges: none (不支持)
    

    Content-Range: bytes 100-200/5000 body中是100-200的内容,资源总长度5000

    ETag: (非必须)资源标识,用于同一位置的资源有更新时,断点下载时携带上次的Etag,服务端作比对

    Last-Modified:(非必须) 资源最后一次更新的时间,作用同ETag

    断点下载实现

    参数:

    • url
    • 文件保存位置
    • 文件名(可以选择url最后的参数)
    • 单次连接超时时间
    • 总超时时间
    • 总尝试连接次数
    1. 查看是否存在要下载的文件(文件不存在,即第一次下载)
    第一次下载时,可以不带Range,此时返回200,资源总长度在Content-Length字段。
    
    第一次下载时,可以带Range:bytes=0-,返回206,资源总长度在Content-Range字段。
    
    文件已存在,带Range:bytes请求
    
    1. 单次下载失败,重试,回到1
    2. 下载成功,作校验
    3. 超过下载设置的参数,认为下载失败

    不使用ETag/Last-Modified时,可以使用response header中的校验字段作最后的检验。

    参考资料

    1. http header https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/If-None-Match
  • 相关阅读:
    ACM题集以及各种总结大全
    ACM题集以及各种总结大全
    线段树题集
    线段树题集
    POJ 1159 Palindrome【LCS+滚动数组】【水题】
    POJ 1159 Palindrome【LCS+滚动数组】【水题】
    开课博客
    第一周学习进度
    开学测试
    寒假总结
  • 原文地址:https://www.cnblogs.com/pukaifei/p/11272731.html
Copyright © 2011-2022 走看看