当前位置: 首页 > news >正文

JAVA编程技巧之如何实现HTTP的断点续传(原理篇)

虽然断点续传已经会了,也知道一些原理,但是总感觉没有吃透,就像别人给我一个东西,告诉我要这么做,但却不是很明白为什么要这么做,这里看到一篇文章,不算难,也不多,算是对理论的一个补习吧:
(一)断点续传的原理

其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:

假设服务器域名为wwww.sjtu.edu.cn,文件名为down.zip。

GET /down.zip HTTP/1.1

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-

excel, application/msword, application/vnd.ms-powerpoint, */*

Accept-Language: zh-cn

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)

Connection: Keep-Alive

服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:

200

Content-Length=106786028

Accept-Ranges=bytes

Date=Mon, 30 Apr 2001 12:56:11 GMT

ETag=W/"02ca57e173c11:95b"

Content-Type=application/octet-stream

Server=Microsoft-IIS/5.0

Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT

所谓断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给

Web服务器的时候要多加一条信息--从哪里开始。

下面是用自己编的一个"浏览器"来传递请求信息给Web服务器,要求从2000070字节开始。

GET /down.zip HTTP/1.0

User-Agent: NetFox

RANGE: bytes=2000070-

Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

仔细看一下就会发现多了一行RANGE: bytes=2000070-;这一行的意思就是告诉服务器down.zip这个文件从2000070字节开始传,前面的字节不用传了。

服务器收到这个请求以后,返回的信息如下:

206

Content-Length=106786028

Content-Range=bytes 2000070-106786027/106786028

Date=Mon, 30 Apr 2001 12:55:20 GMT

ETag=W/"02ca57e173c11:95b"

Content-Type=application/octet-stream

Server=Microsoft-IIS/5.0

Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT

和前面服务器返回的信息比较一下,就会发现增加了一行:

Content-Range=bytes 2000070-106786027/106786028

返回的代码也改为206了,而不再是200了。

知道了以上原理,就可以进行断点续传的编程了。


(二)Java实现断点续传的关键几点

(1)用什么方法实现提交RANGE: bytes=2000070-。

当然用最原始的Socket是肯定能完成的,不过那样太费事了,其实Java的net包中提供了这种功能。代码如下:

URL url = new URL(" http://www.sjtu.edu.cn/down.zip";;);

HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection();

//设置User-Agent

httpConnection.setRequestProperty("User-Agent","NetFox");

//设置断点续传的开始位置

httpConnection.setRequestProperty("RANGE","bytes=2000070");

//获得输入流

InputStream input = httpConnection.getInputStream();

从输入流中取出的字节流就是down.zip文件从2000070开始的字节流。大家看,其实断点续传用Java实现起来还是很简单的吧。接下来要做的事就是怎么保存获得的流到文件中去了。

保存文件采用的方法

采用IO包中的RandAccessFile类。

操作相当简单,假设从2000070处开始保存文件,代码如下:


RandomAccess oSavedFile = new RandomAccessFile("down.zip","rw");
long nPos = 2000070;
//定位文件指针到nPos位置
oSavedFile.seek(nPos);
byte[] b = new byte[1024];
int nRead;
//从输入流中读入字节流,然后写到文件中
while((nRead=input.read(b,0,1024)) > 0)
{
 oSavedFile.write(b,0,nRead);

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

转载于:https://www.cnblogs.com/skiwdhwhssh/p/10342061.html

相关文章:

  • VMware虚拟机提速10招
  • golang []byte转json和json转[]byte
  • C语言近程型(near)和远程型(far)的区别是什么?
  • 机器学习PAI全新功效——实时新闻热点Online Learning实践
  • 浅谈跨国网络传输
  • CNCF TOC现首张中国面孔,谁说云厂商是开源宿敌?
  • 微软私有云分享(R2)27维护窗口的使用
  • 神仙打架?苹果短暂撤销 Facebook 和 Google 的企业证书
  • Oracle网络公开课《请搭载我们的雷霆战机进行跨平台的数据迁移-可传输表空间》...
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • 阿里云包年包月服务器如何退款
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • linux正则
  • BSON与JSON的区别
  • 【译】分页技术简介
  • [NodeJS] 关于Buffer
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • Apache Zeppelin在Apache Trafodion上的可视化
  • C++类的相互关联
  • ES6语法详解(一)
  • JAVA SE 6 GC调优笔记
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript-Array类型
  • Java小白进阶笔记(3)-初级面向对象
  • LeetCode29.两数相除 JavaScript
  • Making An Indicator With Pure CSS
  • MySQL的数据类型
  • Redash本地开发环境搭建
  • select2 取值 遍历 设置默认值
  • springMvc学习笔记(2)
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue-cli3搭建项目
  • Vue官网教程学习过程中值得记录的一些事情
  • WePY 在小程序性能调优上做出的探究
  • 闭包,sync使用细节
  • 初识 beanstalkd
  • 初识MongoDB分片
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 欢迎参加第二届中国游戏开发者大会
  • 记录一下第一次使用npm
  • 码农张的Bug人生 - 见面之礼
  • 使用SAX解析XML
  • 小程序01:wepy框架整合iview webapp UI
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • ###C语言程序设计-----C语言学习(3)#
  • #etcd#安装时出错
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (function(){})()的分步解析
  • (LeetCode C++)盛最多水的容器
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (笔试题)分解质因式
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)springboot助农电商系统 毕业设计 081919