`
JAVA天地
  • 浏览: 674346 次
  • 性别: Icon_minigender_1
  • 来自: 太原
文章分类
社区版块
存档分类
最新评论

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);
}
分享到:
评论

相关推荐

    用Java实现断点续传.txt

    ### 用Java实现断点续传的...综上所述,断点续传功能的实现不仅涉及到HTTP协议的理解和应用,还需要深入掌握Java语言的网络编程技术和文件操作技巧。此外,为了提升用户体验,还需要考虑更多的细节问题和技术优化手段。

    fileupload实现断点续传,大家看看

    本文将深入探讨断点续传的原理、实现方式以及相关的编程技巧。 1. 断点续传的基本原理 断点续传的核心在于保存和恢复上传进度。在上传过程中,服务器和客户端会记录当前的传输状态,如已上传的字节数、文件的总大小...

    支持断点续传(http)

    ### 支持断点续传(HTTP...总之,Java 实现断点续传的过程涉及到了 HTTP 协议的理解、网络编程技巧以及文件操作等多个方面。通过本文介绍的方法和技术,可以有效地解决大文件下载过程中可能出现的问题,提高用户体验。

    多线程断点续传实践学习资料

    3. **断点续传原理**:断点续传的关键在于保存已下载部分的信息,通常通过记录文件的已下载长度和最后的偏移量。当传输中断后,下次启动时,客户端可以基于这些信息向服务器发起范围请求,只获取未下载的部分。 4. ...

    基于Java的多线程与线程安全实践+基于Http协议的断点续传+jar包

    总结,这个资源包涵盖了Java多线程编程的基础和实践,以及在网络通信中实现断点续传的技巧,对于想要提升并发处理能力以及网络编程技能的开发者来说,是非常有价值的参考资料。通过学习和实践,开发者可以更好地理解...

    Http多线程下载与断点续传分析

    在提供的文件列表中,"Jloading"可能是一个Java加载库或者示例代码,用于帮助开发者实现上述的多线程下载和断点续传功能。通过研究这个库,我们可以进一步掌握相关技术和实践技巧。 总之,Http多线程下载和断点续传...

    JAVA编程的FTP客户端库选择技巧.pdf

    "JAVA编程的FTP客户端库选择技巧" FTP(File Transfer Protocol,文件传输协议)是一种常见的网络文件传输方式,它的实现由服务器端服务程序和客户端应用程序两部分组成。本文主要介绍了FTP客户端的JAVA应用程序...

    多线程下载(支持断点)

    这些代码可以作为学习和理解多线程下载与断点续传原理的宝贵资源。 总的来说,多线程下载和断点续传技术为用户提供了高效、灵活的文件下载解决方案,尤其是在大文件和网络环境不稳定的场景下,它们的价值更加凸显。...

    Java网络编程讲义

    14. 文件上传与下载服务:构建一个支持文件上传和下载的Web服务,学习如何处理大文件传输和断点续传。 通过深入学习这份"Java网络编程讲义",你将具备设计和实现网络应用程序的能力,能够处理各种网络通信需求,...

    《Java游戏高级编程》

    根据提供的信息,《Java游戏高级编程》是一本关于Java游戏开发的专业书籍。虽然给出的部分内容主要集中在如何加入学习交流群以及获取历史教学视频的方式,并没有直接提及书中的具体内容,但我们可以根据书名、描述及...

    飞鸽传书及其JAVA源代码

    开发者可以通过阅读和分析这些源码,了解飞鸽传书的内部工作原理,比如它是如何建立TCP连接,如何实现文件的分块传输和断点续传,以及如何保证数据的完整性。 在压缩包中,IPMSG.exe是飞鸽传书的可执行文件,通常...

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    五子棋游戏的Java编程代码示例

    在学习这个项目时,不仅要注意代码的实现,还要理解背后的设计思路和编程技巧,这对于提升Java编程技能和理解游戏逻辑有极大的帮助。同时,如果遇到问题,可以通过查阅相关资料或与其他学习者交流来解决。

    java -opc ua 连接kepserver 源码

    Java OPC UA连接KepServer源码解析与应用 在工业自动化领域,OPC UA(OPC统一架构)...通过阅读和分析源码,可以深入理解OPC UA的原理和Java编程技巧。同时,项目中的注释提供了详细的指导,有助于快速理解和上手。

    JAVA网络蚂蚁制作流程

    为了实现断点续传,在客户端向服务器发起请求时,需要额外添加`Range`头部,指定从哪个位置开始下载文件。例如,若希望从2000070字节的位置开始下载,则请求头应包含如下行:“Range: bytes=2000070-”。 示例请求...

    一个用JAVA实现多线程下载的应用程序和源代码!

    4. **断点续传**:为了提高用户体验,多线程下载程序通常会提供断点续传功能。即当下载中断后,可以从上次停止的位置继续下载,而不是重新开始。这需要程序能够识别已下载的部分,并保存和恢复下载状态。 5. **文件...

    java源码包3

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包2

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    神经网络编程java

    总之,《神经网络编程Java》是一本非常实用的书籍,它不仅覆盖了神经网络的基础理论知识,还详细介绍了如何使用Java和Encog框架来实现这些理论,非常适合希望深入了解神经网络并将其应用于实际项目的开发者阅读。

    java URL 下载器实例

    这个实例是基于Java编程语言实现的,特别强调了多线程技术,以提高下载速度和效率。下面将详细介绍这个下载器的工作原理、核心概念以及如何利用多线程优化下载过程。 一、URL与URLConnection 在Java中,URL...

Global site tag (gtag.js) - Google Analytics