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

_箬宸

_箬宸

2016-03-31 15:15

下面请跟着图老师小编一起来了解下Linux下实现断点续传的原理介绍,精心挑选的内容希望大家喜欢,不要忘记点个赞哦!

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

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

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

  断点续传的原理

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

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/fuwuqi/)

  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];

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/fuwuqi/)

  int nRead;

  // 从输入流中读入字节流,然后写到文件中

  while((nRead=input.read(b,0,1024)) 》 0)

  {

  oSavedFile.write(b,0,nRead);

  }

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

展开更多 50%)
分享

猜你喜欢

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

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

IE同样实现多线程断点续传

windows 操作系统
IE同样实现多线程断点续传

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Java如何实现HTTP断点续传功能

编程语言 网络编程
Java如何实现HTTP断点续传功能

VC中ftp协议实现多线程断点续传

编程语言 网络编程
VC中ftp协议实现多线程断点续传

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

换机后QQ也能断点续传

电脑入门
换机后QQ也能断点续传

彩云安卓版传输管理支持断点续传吗?

Android
彩云安卓版传输管理支持断点续传吗?

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Linux下安装使用sar工具来获取系统运行状态

Linux下安装使用sar工具来获取系统运行状态

Linux系统开机黑屏提示kernel panic该怎么办?

Linux系统开机黑屏提示kernel panic该怎么办?
下拉加载更多内容 ↓