位置: 编程技术 - 正文

HTTP之Range理解

编辑:rootadmin

推荐整理分享HTTP之Range理解,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

 1、什么是Range?

  当用户在听一首歌的时候,如果听到一半(网络下载了一半),网络断掉了,用户需要继续听的时候,文件服务器不支持断点的话,则用户需要重新下载这个文件。而Range支持的话,客户端应该记录了之前已经读取的文件范围,网络恢复之后,则向服务器发送读取剩余Range的请求,服务端只需要发送客户端请求的那部分内容,而不用整个文件发送回客户端,以此节省网络带宽。

 2、HTTP1.1规范的Range是怎样一个约定呢?

  如果Server支持Range,首先就要告诉客户端,咱支持Range,之后客户端才可能发起带Range的请求。这里套用唐僧的一句话,你不说我怎么知道呢。response.setHeader('Accept-Ranges', 'bytes');

  Server通过请求头中的Range: bytes=0-xxx来判断是否是做Range请求,如果这个&#;存在而且有效,则只发回请求的那部分文件内容,响应的状态码变成,表示Partial Content,并设置Content-Range。如果无效,则返回状态码,表明Request Range Not Satisfiable( )。如果不包含Range的请求头,则继续通过常规的方式响应。

3、应用

Range,是在 HTTP/1.1( header field,也是现在众多号称多线程下载工具(如 FlashGet、迅雷等)实现多线程下载的核心所在。

Range 的规范定义如下:ranges-specifier = byte-ranges-specifierbyte-ranges-specifier = bytes-unit “=” byte-range-setbyte-range-set = 1#( byte-range-spec | suffix-byte-range-spec )byte-range-spec = first-byte-pos “-” [last-byte-pos]first-byte-pos = 1*DIGITlast-byte-pos = 1*DIGIT(RFC 里充斥着这种形式的定义,一开始觉得挺乱,后来习惯了就发现其实挺科学,挺好理解的:))

&#;得注意的就是 byte-range-set 是一个 byte-range 的集合,所以在实际请求中完全可能会出现如下这种形式:Range: bytes=-,-这个数据区间是个闭合区间,起始&#;是 0,所以“Range: bytes=0-1”这样一个请求实际上是在请求开头的 2 个字节。

byte-range-spec 里的 last-byte-pos 可以省略,代表从 first-byte-pos 一直请求到结束位置。其实 first-byte-pos 也是可以省略的,只不过就不叫 byte-range-spec 了,而是叫 suffix-byte-range-spec,规范如下:suffix-byte-range-spec = “-” suffix-lengthsuffix-length = 1*DIGIT比如“Range: bytes=-”,它不是表示请求文件开始位置的 个字节,而是表示要请求文件结尾处的 个字节。

HTTP之Range理解

如果 byte-range-spec 的 last-byte-pos 小于 first-byte-pos,那么这个 Range 请求就是无效请求,server 需要忽略这个 Range 请求,然后回应一个 OK,把整个文件发给 client。如果 byte-range-spec 里的 first-byte-pos 大于文件长度,或者 suffix-byte-range-spec 里的 suffix-length 等于 0,那么这个 Range 请求被认为是不能满足的,server 需要回应一个 Requested range not satisfiable。

server 除了要能理解 Range 请求之外,在回应 client 时还要使用 Content-Range 来告诉 client 他到底发送了多少数据,Content-Range 的规范定义如下:Content-Range = “Content-Range” “:” content-range-speccontent-range-spec = byte-content-range-specbyte-content-range-spec = bytes-unit SP byte-range-resp-spec “/” ( instance-length | “*” )byte-range-resp-spec = (first-byte-pos “-” last-byte-pos) | “*”instance-length = 1*DIGIT

详尽的细枝末节就不在这里记述了,举个例子说明一下,比如某文件的大小是 字节,client 请求这个文件时用了 “Range: bytes=0-”,那么 server 应该把这个文件开头的 个字节发回给 client,同时回应头要有如下内容:Content-Range: bytes 0-/

Range 请求的一些注意事项:1) 不支持 Range 请求的 server 要用“Accept-Ranges: none”对 client 表明心意;server 也可以主动告诉 client “Accept-Ranges: bytes”,但是 client 也可以在没有收到这个指示的前提下向 server 发 Range 请求。2) byte-range-set 中的区间可以是“有洞”的,也可以是部分重叠的3) 单区间的 byte-range-set 正常回应就可以了,但是多区间 byte-range-set 需要 server 使用 multipart/byterange 来回应

Range头域   Range头域可以请求实体的一个或者多个子范围。例如,   表示头个字节:bytes=0-   表示第二个字节:bytes=-   表示最后个字节:bytes=-   表示字节以后的范围:bytes=-   第一个和最后一个字节:bytes=0-0,-1   同时指定几个范围:bytes=-,-

4、Range相关的问题

(1)、写多线程下载时老报Http的错误,正常的话应该返回code ,但是这次却不正常,后来研究了一下,发现如下问题: 以下是错误log:Server returned HTTP response code: for URL: at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) at com.lyc.download.Demo$DownloadThread.run(Demo.java:)

HTTP response code: 是由于读取文件时设置的Range有误造成的,具体的说就是下面这行代码有误:

connection.setRequestProperty("Range", "bytes=:"&#;startIndex&#;"-"&#;endIndex);

中间的冒号:就是罪魁祸首,敲代码的时候不小心多敲了个冒号造成的;

(2)xutils android框架下载文件时,如果文件下载完成还继续下载会报”maybe the file has downloaded completely“

android压力测试命令monkey详解 一、Monkey是什么?Monkey就是SDK中附带的一个工具。二、Monkey测试的目的?:该工具用于进行压力测试。然后开发人员结合monkey打印的日志和系统打印的日

在Android studio 中配置高德地图api后显示地图遇到的问题 在Androidstudio中按照高德官网中配置地图api后,显示地图时报错如下图原因是高德官网上是拿在eclipse中配置为示例,而在Androidstudio中配置的时候需要去

获取android项目相关信息 1.获取设备号publicstaticStringgetIMEI(Contextcontext){return((TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();}2.获取项目版本号publicstaticintgetVersion

标签: HTTP之Range理解

本文链接地址:https://www.jiuchutong.com/biancheng/387469.html 转载请保留说明!

上一篇:Android圆形图片--自定义控件(android 圆形图片)

下一篇:android压力测试命令monkey详解(安卓app压力测试)

  • 进口报关商品的完税价格包含运费吗
  • 增值税专用发票可以开电子发票吗
  • 进项税额转出的情况
  • 进项税额抵扣计算
  • 为员工代缴社保材料
  • 其他应收款平账怎么做分录
  • 开票系统技术服务费在申报表哪里抵扣
  • 公司销售固定资产汽车如何填申报表
  • 暂估入库发票差额怎么办
  • 公允价值变动损益在利润表哪里
  • 哪些发票可以用ppt
  • 非居民企业间接转让股权案例
  • 价内税和价外税区别
  • 公司缴纳社保要多久
  • 金税盘怎么增加复核人
  • 总账会计需要做账吗
  • 广告业发生错账怎么办
  • 车辆保险分期分摊怎么做账?
  • 工程部物品领用表格模板
  • 如何在Windows 11上卸载更新
  • 调整应收账款如何做账
  • 小规模纳税人的专票可以抵税吗
  • win11测试版和正式版区别
  • transformer toys
  • 公司支付的赔偿金要扣税吗
  • Radio.exe - Radio是什么进程 有什么用
  • 企业间实物交易是指
  • 最小的电脑是多少寸的
  • 支付征地补偿款计入什么科目
  • 出口商品要交增值税吗
  • 圣帕特里克的传说
  • 前端密码加密
  • 固定资产进项抵扣新政策2021
  • 应收账款属于会计要素中的什么科目
  • 手把手教你安装nvidia驱动
  • 慰问金计入什么预算科目
  • 什么是预收账款减少
  • mysql的基本介绍
  • 企业所得税季度申报表营业收入怎么填写
  • 个税汇算清缴时劳务报酬怎么计税
  • 电子承兑 背书
  • 珠宝行业的会计处理方式
  • 福利费列支的个税怎么算
  • 增值税留抵怎么做凭证
  • 委托生产产品
  • 申报表弥补以前年度亏损是链接哪个数据
  • 子公司提取盈余公积
  • 公司账户转个人往来款
  • 印花税是根据什么计算的
  • 企业支付境外佣金要交税吗?
  • 非税收入定额票据是什么
  • 交上年企业所得税怎么做会计分录
  • 增值税其他收益包括哪些
  • 资产负债表怎么看财务状况
  • 公司的应付账款
  • sql server设置自增
  • sql必学必会
  • win7还原系统怎么还原
  • xp内置语音输入没反应
  • assoc.exe
  • windowsxpwifi
  • linux块设备读写和回写
  • unity jsonutility
  • 在unity中单例的主要作用
  • 慎用小儿百部止咳糖浆
  • ExtJS 2.0 GridPanel基本表格简明教程
  • The method setClass(Context, Class<?>) in the type Intent is not applicable for the问题
  • Facebook推出强大Android图片库Fresco 自动释放内存 图片缓存 内存益处
  • js自定义鼠标右键菜单
  • javascript的简介
  • android获取本机ip地址
  • python 命令
  • 基于JAVASCRIPT实现的可视化工具是
  • 广西地方税务局决算公开表
  • 浙江职称评审网址官网
  • 税务总局绩效管理四大板块
  • 云南省税务干部学校是干什么的
  • 税务上门核查要看什么
  • 进项发票勾选认证如何导出明细
  • 所得税汇算清缴退税税务局要来查账
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设