`
longgangbai
  • 浏览: 7325678 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

断点续传的应用开发和原理

阅读更多

我将详细的从断点续传的原理帮你解决这个问题。

    (一)断点续传的原理

    其实断点续传的原理很简单,就是在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);
    }

分享到:
评论

相关推荐

    Unity下实现断点续传的下载_demo

    在Unity游戏开发中,断点续传是一种非常实用的技术,特别是在处理大文件下载时,能够提高用户体验并降低服务器压力。断点续传允许用户在中断网络连接后从上次停止的地方继续下载,而不是重新开始。本示例将详细介绍...

    断点续传程序

    断点续传技术是计算机网络传输领域中一种重要的功能,特别是在大文件传输时,它...本压缩包提供的断点续传模板程序是一个很好的学习和实践资源,可以帮助开发者深入理解这一技术,并在此基础上开发自己的断点续传应用。

    spring boot实现大文件断点续传

    首先,了解断点续传的基本原理。断点续传是一种文件传输技术,它允许用户在文件上传或下载过程中暂停,然后在稍后的时间从暂停的地方继续,而不是重新开始。这大大提高了用户体验,特别是对于大文件,如高清视频、...

    Android多线程断点续传下载

    通过这个"MultiThreadDownload"项目,开发者可以学习到如何在Android中实现多线程断点续传下载,理解其背后的原理和技术细节,这对于提升应用的下载性能和用户体验非常有帮助。记得阅读源代码中的注释,它们会进一步...

    安卓断点续传

    下面我们将深入探讨安卓断点续传的工作原理、实现方法以及使用第三方框架的可能性。 1. 断点续传的工作原理: 断点续传的核心在于保存已下载部分的信息,包括文件的总大小、已下载的字节数、以及当前的下载位置。...

    利用libcurl实现ftp断点续传

    断点续传功能是FTP的一个重要特性,允许用户在上传或下载大文件时中断操作,并在稍后从停止的地方继续,这对于网络不稳定或者长时间传输的情况非常有用。 libcurl是一个流行的开源库,支持多种网络协议,包括FTP,...

    下载及断点续传

    在本文中,我们将深入探讨下载和断点续传的基本原理,以及如何在实际应用中实现这一功能。 一、下载技术基础 1. **HTTP协议**:大多数文件下载都是通过HTTP或HTTPS协议进行的。HTTP是超文本传输协议,负责在网络上...

    支持断点续传的下载进度对话框

    在安卓应用开发中,创建一个支持断点续传的下载进度对话框,需要以下关键组件和技术: 1. **文件管理**:应用需要能够识别和保存已下载的部分,这通常通过在本地文件系统中创建临时文件或部分文件实现。下载过程中...

    FTP及断点续传原理

    总的来说,FTP及断点续传原理是网络开发和运维中的基础技能,了解和掌握这些知识对于进行文件传输相关的系统设计和故障排查至关重要。通过学习提供的资源,你可以深入理解FTP的工作机制,以及如何实现断点续传功能,...

    android断点续传

    在Android开发中,断点续传是一项重要的技术,主要用于大文件下载。断点续传允许用户在文件下载中断后,从上次停止的地方继续下载,而不是重新开始,这大大提高了用户体验,尤其是在网络不稳定或者电量有限的情况下...

    Http断点续传 例子

    #### 三、Java中使用HttpURLConnection进行断点续传开发 在Java中,可以使用`HttpURLConnection`类来实现HTTP请求,并利用其提供的方法来发送带有`Range`头的请求,进而实现断点续传功能。 下面以给定的`...

    断点续传实例

    - 其他如`.mymetadata`和`.myumldata`可能是Eclipse插件或MyEclipse(一个基于Eclipse的集成开发环境)的自定义数据,不直接涉及断点续传的实现。 虽然无法提供具体的代码分析,但从上述描述和文件结构中可以看出...

    DownAndASIRequest下载,断点续传

    在iOS开发中,实现文件的下载,特别是大文件的下载,断点续传是一个非常重要的功能。这个项目“DownAndASIRequest”就是基于ASIHttpRequest库实现的一个简单示例,它展示了如何在iOS应用中实现这一功能。下面我们将...

    断点续传下载文件_c#断点续传_C#_网络操作_

    在IT领域,网络操作是应用程序开发中的重要组成部分,尤其是在处理大文件下载时,断点续传技术显得尤为重要。本文将详细解析使用C#语言实现断点续传下载文件的原理和方法。 首先,断点续传是一种允许用户暂停并重新...

    oss下载(断点续传,后台显示进度)源代码.rar

    在开发过程中,特别是涉及大文件下载时,断点续传功能尤为重要,因为它允许用户在中断下载后从上次停止的地方继续,而无需重新开始。此外,后台显示下载进度的功能则可以提升用户体验,让用户清晰地了解文件下载的...

    android多线程断点续传

    以下将详细讲解多线程断点续传的概念、实现原理以及在Android中的应用。 **多线程下载** 多线程下载是指在下载大文件时,将其分割成多个小部分,然后用多个线程同时下载这些部分。这种方法可以充分利用网络带宽,...

Global site tag (gtag.js) - Google Analytics