先说说断点续传的原理:这是HTTP 1.1协议的一部分,并不需要客户端特意去做多么复杂的事情。以前我曾经看过一个单位的技术标书,其中有下载的断点续传这一要求,给出的offer居然还挺高的...

简单的说,只要利用了HTTP协议(http://www.ietf.org/rfc/rfc2616.txt)中的如下字段来和服务器端交互,就可以实现文件下载的断点续传:

Range : 用于客户端到服务器端的请求,可通过该字段指定下载文件的某一段大小,及其单位。典型的格式如:

Range: bytes=0-499 下载第0-499字节范围的内容

Range: bytes=500-999  下载第500-999字节范围的内容

Range: bytes=-500  下载最后500字节的内容

Range: bytes=500-  下载从第500字节开始到文件结束部分的内容(这是最常用的一种格式)

Range: bytes=0-0,-1  下载第一以及最后一个字节的内容(这个看上去有点变态...)

Accept-Ranges : 用于服务器端到客户端的应答,客户端通过该字段可以判断服务器是否支持断点续传(注意RFC中注明了这一部分并不是必须的)。格式如下:

Accept-Ranges: bytes  表示支持以bytes为单位进行传输。

Accept-Ranges: none  表示不支持

Content-Ranges : 用于服务器端到客户端的应答,与Accept-Ranges在同一个报文内,通过该字段指定了返回的文件资源的字节范围。格式如下:

Content-Ranges: bytes 0-499/1234  大小为1234的文件的第0-499字节范围的内容

Content-Ranges: bytes 734-1233/1234  大小为1234字节的文件的第734-结尾范围的内容

据此我们可以知道,断点续传这个功能是需要客户端和服务器端同时支持才能完成。

Android平台面向开发者提供了DownloadManager这个服务(service),可以用来完成下载,同时异步地得到下载进度的实时更新提示。原生的浏览器,Android Market以及GMail等客户端都使用了该接口。该接口也部分的提供了断点续传功能:如果在下载过程中遇到网络错误,如信号中断等,DownloadManager会在网络恢复时尝试断点续传继续下载该文件。但不支持由用户发起的暂停然后断点续传。

要扩展该功能也不难,只要为下载任务新增一种状态(类似paused_by_user),以及相关逻辑即可,这里暂不赘述,把话题引到一些常见问题上。

1. 关于ETag

RFC中的定义有些抽象,简单的说,ETag可以用来标识/保证文件的唯一性或完整性,你可以把它看作是服务器为某个文件生产的唯一标识值,每次文件有更新该值就会变化。通过这种机制客户端可以检查某个文件在断点续传(当然它不仅仅用于断点续传)的前后是否有所改动:如果ETag改变了就应该重新下载整个文件以保证它的完整性。

但是在现实环境中,有一些服务器并不返回ETag字段,同时它又是支持断点续传的,这种情况下原生的Android就会认为服务器端不支持断点续传。这应该不是什么bug,仅仅是这么实现而已。还有更麻烦的情况是,有些服务器给了错误的ETag,但文件是从未更改的,这时候要想从客户端修改这个“bug”,估计只能忽略ETag值了。

2. 关于HTTP 206

RFC中定义了断点续传时服务器端的应答情况:如果支持且返回的内容如请求所要求的那样,是该文件的一部分,则使用HTTP 206状态码;如果不支持,或需要返回整个文件,则使用HTTP 200状态码。但是现实网络中有些服务器不管三七二十一,都返回200。没办法,如果还是想从客户端来修改这个“bug”,那就多做一些判断处理吧:如果服务器指定了“Content-Ranges”,就忽略HTTP 200的状态码。

附图一张,简述流程。见附件

补记:有一次被问起如何在原生的Android手机上暂停一个下载任务,回头再断点续传。我想是不是可以在下载过程中将手机信号关闭,下次再打开手机信号时,那个下载任务就可以自动接着续传了(当然前提是服务器支持)...这个用例没多大实用价值,懒得实测了

java 断点续传 开源_java断点续传原理相关推荐

  1. java 断点续传 开源_java断点续传后台代码

    /** * 文件下载 * @param request * @param response */ @RequestMapping(params = "viewFile") publ ...

  2. java三层 开源_java 山寨qq 聊天工具(基于mvc三层架构,附 mvc架构模式pdf说明文档)支持开源...

    [实例简介] java 山寨qq 聊天工具(基于mvc三层架构,附 mvc架构模式pdf说明文档)支持开源 [实例截图] [核心代码] java山寨qq聊天工具(基于mvc三层架构,附mvc架构模式p ...

  3. java linkedlist实例_Java Linkedlist原理及实例详解

    这篇文章主要介绍了Java Linkedlist原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 定义:linkedlist属于链表结构 ...

  4. java nio 事件_Java NIO原理及实例

    Java NIO是在jdk1.4开始使用的,它既可以说成"新I/O",也可以说成非阻塞式I/O.下面是java NIO的工作原理: 1. 由一个专门的线程来处理所有的 IO 事件, ...

  5. java thread类_Java多线程原理及Thread类详解

    多线程原理 代码如下: 自定义线程类: 测试类: 流程图: 程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建.随着调用mt的对象的start方法,另外一 ...

  6. java 匿名内部类 参数_Java匿名内部类原理与用法详解

    本文实例讲述了Java匿名内部类原理与用法.分享给大家供大家参考,具体如下: 一 点睛 匿名内部类适合创建那种只需要一次使用的类,定义匿名内部类的语法格式如下: new 父类构造器(实参列表) | 实 ...

  7. Java异常处理实验原理_Java异常处理原理与原则

    一.Exception和Error的区别 在Java中我们可以这样区分,异常(Exception)是一种非程序原因的操作失败(Failure),而错误(Error)则意味着程序有缺陷(Bug). 二. ...

  8. java eventbus 原理_本文为 Android 开源项目实现原理解析 EventBus 部分,从源码分析 EventBus 的实现原理...

    之前太忙导致 Android 开源项目实现原理解析 一度搁浅,目前一期进行中,我也完成了 EventBus 分析的初稿,大家可以稍微看看后面会继续润色下. PS:本文直接复制 Markdown,格式有 ...

  9. java 反射机制_Java反射机制原理探究

    反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...

最新文章

  1. 【记录】入选《开发工具领域内容榜》第6名
  2. 《Android传感器开发与智能设备案例实战》——第1章,第1.2节Android的巨大优势...
  3. mybatis 原理_Mybatis工作流程及其原理与解析
  4. 使用这个,自定义AlertDialog在你手里都不是问题
  5. 大话设计模式之----状态模式
  6. .gen格式文件读取,完成兰伯特和墨卡托投影转换
  7. python文件打开后闪退_python文件打开闪退要怎么处理?
  8. sox免安装直接使用
  9. 用Python抓取漫画并制作mobi格式电子书
  10. Bithumb Global AMA丨Cred加速实现开放金融-打造区块链上蚂蚁金服
  11. autojs打开微信扫一扫,扫描二维码等信息的脚本
  12. PPT制作技巧汇总之图形对象与多媒体应用(office 2007)
  13. hdu-7113 Matrix 组合数学(计算贡献
  14. 易语言程序转c语言,c语言实现简单的易语言
  15. 安科瑞运维项目中的计量产品应用及解决方案
  16. 计算机考研各科目分值分布,考研各个科目的分值
  17. 【计算机网络】可靠传输
  18. 转溪风吴韵のPower Design下载地址
  19. Win7系统下搭建NFS服务器
  20. 蘑菇云【行空板Python入门教程】第四课:模拟星空

热门文章

  1. CRM and Saptest1 Fiori UI共存的一个典型例子
  2. 2019年6月19日Jerry Wang的SAP SAP Cloud Connector练习
  3. 隐藏search parameter在configuration tab里不相关的field
  4. IBASE archive pre-processing report RIBARCHV
  5. 另一种无法enable ABAP source code tool的原因
  6. BAdI to control ALV grid display
  7. SAP云平台 CloudFoundry环境下的space guid
  8. windows系统上使用openssh client连接远程Linux服务器的日志分析
  9. SAP Cloud for Customer里的Sales Lead和Lead
  10. php判断除数是不是整数,五种js判断是否为整数类型方式