Linux下实现断点续传的原理介绍

   断点续传是一种结合本地存储和网络存储的技术,主要用来解决网络失效时的视频丢失问题。DVS通常本身没有视频存储功能,而是必须由后端的NVR来实现视频的存储,因此对于网络稳定性要求很高,网络连接失败、丢包严重、抖动等各种因素都可能造成视频数据的丢失。断点续传支持从文件上次中断的地方开始传送数据,而并非是从文件开头传送。这就是断点续传的定义。系统都默认可以断点续传,但我们很少知道他的原理,下面就来看看小编的介绍吧。


  断点续传的原理

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

  }

  以上就是断点续传的原理,知道这些原理,相信大家都能够进行编程了吧,这个技术在现在的电脑技术上也算不得什么,打家应该都注意到我们下载时都是断点续传吧

时间: 2024-08-03 10:55:43

Linux下实现断点续传的原理介绍的相关文章

【OS】Linux下 /dev 常见特殊设备介绍与应用[loop]

[OS]Linux下 /dev 常见特殊设备介绍与应用[loop] 在这里详细介绍一下loop设备.在进行某些测试的时候,往往需要新建一些磁盘分区或者设备等,此时对硬盘进行重新划分往往不太方便.在这种情况下,可以通过loop伪设备来实现循环挂载,从而达到目的.在使用之前,循环设备必须与现存文件系统上的文件相关联.这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用.因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载.这种设备文件经

Linux下流量监控工具iftop使用介绍

今天介绍一款linux下监控即时宽带使用情况的软件iftop,iftop可以查看流量动态,帮助你解决.查找网络慢的问题. 当然查看网卡流量工具还有iptraf.nethogs等等,今天主要推荐iftop! 软件安装: cd /byrd/tools/ wget http://www.ex-parrot.com/~pdw/iftop/download/iftop-0.17.tar.gz tar zxf iftop-0.17.tar.gz cd iftop-0.17 yum install flex

linux下的yum命令原理和详解_Linux

yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载.安装.yum提供了查找.安装.删除某一个.一组甚至全部软件包的命令,而且命令简洁而又好记. yum的命令形式一般是如下:yum [options] [command] [package ...] 其中的[opt

Linux下系统资源监控工具Collectl基本介绍

Collectl 是一个轻量级的性能监控工具,可监控包括 CPU.磁盘.带宽.内存.网络.NFS.进程等等信息. 对系统资源的监控,是系统管理员的一个必备的任务,我们经常需要监控系统资源以便解决相应的系统问题.Linux系统也自带很多的监控工具,如top.vmstat.iostat.sar等,对这些工具的熟练使用时非常重要的,但是这些工具太散了,有时候我们可能会需要看一些更全面地数据,Collectl就是一个这样的超级工具.之前我已经介绍过IBM的监控工具nmon了,nmon监控也是非常全面的,

linux下cat与vi命令介绍

cat 命令介绍 cat 命令的原含义为连接(concatenate), 用于连接多个文件内容并输出到标准输出流中(标准输出流默认为屏幕).实际运用过程中,我们常使用它来显示文件内容.如果您熟悉MS-DOS 下的type 命令,相信不难掌握cat 命令.该命令的常用示例如下: cat file1.txt 显示 file1.txt 文件的内容: cat file1.txt file2.txt 显示 file1.txt 和file2.txt 文件的内容: cat -n file1.txt 显示 fi

linux下修改用户的工具介绍第1/2页_unix linux

1.chfn 修改用户信息工具: chfn 这个工具主要是用来改用户的全名,办公室地址,电话之类的:用法如下: chfn [ -f full-name ] [ -o office ] [ -p office-phone ] [ -h home-phone ] [ -u ] [ -v ] [ username ] 最简单的方法是 chfn 用户名 [root@localhost ~]# chfn beinanlinux 注:更改用户beinanlinux的信息: Changing finger i

linux下redis的安装配置介绍

Redis是什么 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis提供了一些丰富的数据结构,包括 lists, sets, ordered sets 以及 hashes ,当然还有和Memcached一样的 strings结构.Redis当然还包括了对这些数据结构的丰富操作. Redis的优点 性能极高 – Redis能支持超过 100K+ 每秒的读写频率. 丰富的数据类型 – Redis支

linux下access函数的用法介绍_C 语言

Linux内核总是根据进程的有效用户ID和有效组ID来决定一个进程是否有权访问某个文件.因此,在编写调整用户ID的程序时,在读写一个文件之前必须明确检查其用户是否原本就有对此文件的访问权限.为了实现这种确认,需要使用access函数. 一般形式为;#include<unistd.h>int access(const char *pathname,int mode); 其中,pathname是希望检验的文件名(包含路径),mode是欲检查的访问权限,如下所示 R_OK   检验调用进程是否有读访

断点续传简单原理介绍

     断点续传,也就是要从文件已经下载的地方开始继续下载.所以在客户端浏览器传给Web服务器的时候要多加一条信息--从哪里开始.      下面是内容传递请求信息给Web服务器,要求从2000070字节开始.     GET /down.zip HTTP/1.0      User-Agent: Netfront3     RANGE: bytes=2000070-      Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=