你是不是在因为断点续传而烦恼着呢?告诉你不用了,现在我将详细的从断点续传的原理帮你解决这个问题。
(一)断点续传的原理
其实断点续传的原理很简单,就是在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);
}
文章就介绍到这里了,聪明的你是否明白了呢?有不明白的地方发贴子过来吧!
分享到:
相关推荐
为了更好地理解断点续传的实现细节,我们来看一段示例代码,该代码展示了如何在一个简单的FTP服务端实现断点续传的功能。 ```java // FTPServer.java - 断点续传服务端实现 public class FTPServer { // 文件发送...
在探讨具体的实现之前,我们先来理解下断点续传的基本原理。断点续传功能已经成为现代网络应用中的一项重要特性,尤其是在文件传输领域。其核心目标是在遇到网络中断或用户主动暂停下载时,能够继续之前的下载进度而...
本资料包“基于C#的WebAPI断点续传几种方式及WebClient断点续传下载.zip”主要探讨了两种在C#环境下实现断点续传的方法:一是通过WebAPI实现服务端的断点续传功能,二是使用WebClient类进行客户端的断点续传下载。...
在这个实例中,我们将探讨如何在FastDFS中实现断点续传功能,并基于一个名为"vvhcc-fastdfs"的压缩包文件进行讲解。 1. **FastDFS架构与原理** FastDFS由两部分组成:跟踪服务器(Tracker Server)和存储服务器...
本文将详细介绍FTP断点续传的工作原理及其编程实现方法。 #### 二、FTP断点续传的基本原理 FTP断点续传是指在网络环境不稳定的情况下,能够继续上一次未完成的文件传输任务,而无需重新开始传输整个文件。这一功能...
当下载过程中由于网络问题或其他原因中断,可以利用断点续传来继续未完成的下载,而无需重新开始。 断点续传原理是通过记录已下载部分的信息(通常是一个包含下载进度的文件),在下次下载时,`curl`会读取这个信息...
在这个场景下,结合Google的断点续传框架,我们可以实现大文件的高效、安全上传,即使在上传过程中网络中断,也能从上次中断的位置继续,而无需重新开始。以下是对这个知识点的详细解释。 首先,了解断点续传的基本...
断点续传是一种在网络传输大文件时非常实用的技术,它允许用户在文件下载中断后从上次停止的地方继续...总的来说,理解HTTP协议的范围请求机制是实现断点续传的关键,而Java的流操作则提供了实现这一机制的基础工具。
在Java中,实现断点续传的关键在于读取和写入文件的能力。Java的`java.io`包提供了丰富的类,如`FileInputStream`、`FileOutputStream`、`RandomAccessFile`等,可以帮助我们进行复杂的文件操作。`RandomAccessFile`...
在这篇文章中,我们将讨论 FTP 断点续传的实现,包括 FTP 协议的基本原理、断点续传的实现方法和 FTP 命令的使用。 FTP 协议的基本原理 FTP 协议是一个基于 TCP 的客户服务器架构的协议。FTP 服务器进程可以同时为...
FTP(File Transfer Protocol)是一种广泛使用的互联网协议,用于在计算机之间传输文件。...通过学习提供的资源,你可以深入理解FTP的工作机制,以及如何实现断点续传功能,从而提高文件传输的效率和可靠性。
tusdotnet 是一个基于.NET 的tus 协议实现,提供了一个简单的方式来实现断点续传。该方案支持.NET 和.NET Core,能够满足各种上传需求。 知识点4:断点续传实现原理 断点续传是指在上传过程中,客户端和服务器之间...
对于开发者来说,理解FastDFS的工作原理和API使用,以及如何在代码层面实现断点续传的逻辑,是非常关键的技能。在实际项目中,可以结合具体的业务需求和环境进行优化,例如使用异步上传、多线程处理等技术进一步提升...
首先,我们需要理解断点续传的基本原理。它主要依赖于HTTP协议中的Range头字段。当客户端(如Unity应用程序)发起一个带有特定Range头的请求时,服务器会返回指定范围内的数据,而不是整个文件。例如,如果已经下载...
断点续传功能是FTP的一个重要特性,允许用户在上传或下载大文件时中断操作,并在稍后从停止的地方继续,这对于网络不稳定或者长时间传输的情况非常有用。 libcurl是一个流行的开源库,支持多种网络协议,包括FTP,...
下面是一个基本的例子,展示了如何通过`HttpURLConnection`来实现断点续传: ```java URL url = new URL("http://www.sjtu.edu.cn/down.zip"); HttpURLConnection httpConnection = (HttpURLConnection) url.open...
实现断点续传的前提是,大文件切片上传。然后前端得问后端哪些chunk曾经上传过,让前端跳过这些上传过的chunk就好了。 前端的上传器(uploader.js)在上传时会先发送一个GET请求,这个请求不会携带任何chunk数据,...
在VC++编程环境中,实现断点续传主要涉及到以下几个关键知识点: 1. 文件流操作:VC++中通常使用`fstream`库来处理文件的读写操作。`ifstream`用于打开和读取文件,`ofstream`用于写入文件。在断点续传中,我们需要...
以下是实现断点续传的一些关键步骤: 1. **文件分块**:将大型文件分割为多个小块(例如,每个块5MB)。这样,客户端可以一次处理一个块,而不是整个文件。 2. **状态存储**:客户端需要存储每个块的下载或上传...
下面我们将深入探讨安卓断点续传的工作原理、实现方法以及使用第三方框架的可能性。 1. 断点续传的工作原理: 断点续传的核心在于保存已下载部分的信息,包括文件的总大小、已下载的字节数、以及当前的下载位置。...