手机版

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

时间:2021-11-19 来源:互联网 编辑:宝哥软件园 浏览:

断点续传是一种本地存储和网络存储相结合的技术,主要用于解决网络出现故障时的视频丢失问题。DVS通常没有视频存储功能,但后端必须由NVR存储,因此对网络稳定性要求较高,网络连接故障、严重丢包、抖动等各种因素都可能造成视频数据的丢失。断点续传支持从文件最后被中断的地方开始传输数据,而不是从文件的开头开始传输。这就是断点续传的定义。默认情况下,系统可以在断点处继续传输,但我们很少知道它的原理。让我们来看看边肖的介绍。

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

  断点续传的原理

其实断点续传的原理很简单,就是在Http请求上有别于普通下载。

例如,当浏览器在服务器上请求文本时,请求如下:

假设服务器域名是wwww.sjtu.edu.cn,文件名是down.zip

HTTP/1.1

接受:image/gif、image/x-xbitmap、image/jpeg、image/pjpeg、application/vnd.ms-

excel,应用程序/msword,应用程序/vnd.ms-powerpoint,*/*

接受语言:zh-cn

接受-编码:gzip,放气

用户代理:Mozilla/4.0(兼容;MSIE 5.01Windows NT 5.0)

连接:保持活力

收到请求后,服务器根据需要搜索请求的文件,提取文件的信息,然后将其返回给浏览器。返回的信息如下:

200

内容-长度=106786028

接受-范围=字节

日期=2001年4月30日星期一格林尼治时间12:56:11

ETag=W/"02ca57e173c11:95b "

内容类型=应用程序/八位字节流

服务器=微软-IIS/5.0

最后修改时间=2001年4月30日星期一格林尼治时间12:56:11

所谓断点续传,就是文件要从已经下载的地方下载。因此,当客户端浏览器将其发送到网络服务器时,应该再添加一条消息——从哪里开始。

下面是用自己做的一个“浏览器”把请求信息传送到Web服务器。请求从2000070字节开始。

HTTP/1.0

用户代理:NetFox

范围:字节=2000070-

接受:文本/html,图像/gif,图像/jpeg,*;q=.2,*/*;q=.2

仔细看会发现多了一行RANGE: bytes=2000070- 070-。

这一行的意思是告诉服务器文件down.zip是从2000070字节开始传输的,前面的字节不用传输。

收到此请求后,服务器返回以下信息:

206

内容-长度=106786028

内容-范围=字节2000070-106786027/106786028

日期=2001年4月30日星期一格林尼治时间12:55:20

ETag=W/"02ca57e173c11:95b "

内容类型=应用程序/八位字节流

服务器=微软-IIS/5.0

最后修改时间=2001年4月30日星期一格林尼治时间12:55:20

将其与前一个服务器返回的信息进行比较,您会发现添加了一行:

内容-范围=字节2000070-106786027/106786028

返回代码改为206,而不是200。

知道了以上原理,就可以编程断点续传了。

Java 实现断点续传的关键几点

(1)用什么方法实现提交RANGE: bytes=2000070- 070-。

当然,使用最原始的Socket当然可以,但是太费力了。事实上,这个函数是在Java的. net包中提供的。代码如下:

URL url=新URL(" http://www . sjtu . edu.cn/down . zip ");

Httpurlconnection HttpConnection=(Httpurlconnection)URL . OpenConnection();

//设置用户代理

httpconnection . setrequestproperty(" User-Agent "," NetFox ");

//设置断点续传的起始位置。

httpconnection . setrequestproperty(" RANGE "," bytes=2000070 ");

//获取输入流。

InputStream input=httpconnection . getinputstream();

从输入流提取的字节流是来自2000070的down.zip文件的字节流。你看,其实在Java中实现断点续传还是很简单的。接下来要做的是如何将获得的流保存到文件中。

用于保存文件的方法。

我在IO包中使用了RandAccessFile类。

操作相当简单,假设文件保存自2000070,代码如下:

randomaccessosavedfile=new RandomAccessFile(" down . zip "," rw ");

长nPos=2000070

//找到指向NPo位置的文件指针。

osavedfile . seek(NPo);

字节[] b=新字节[1024];

int nRead

//从输入流中读取字节流并将其写入文件。

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

{

oSavedFile.write(b,0,nRead);

}

这些就是断点续传的原理。知道了这些原则,相信大家都能编程了。这项技术在今天的计算机技术中算不了什么。大家下载的时候要注意断点续传。

版权声明:Linux下实现断点续传原理介绍是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。