断点续传是一种本地存储和网络存储相结合的技术,主要用于解决网络出现故障时的视频丢失问题。DVS通常没有视频存储功能,但后端必须由NVR存储,因此对网络稳定性要求较高,网络连接故障、严重丢包、抖动等各种因素都可能造成视频数据的丢失。断点续传支持从文件最后被中断的地方开始传输数据,而不是从文件的开头开始传输。这就是断点续传的定义。默认情况下,系统可以在断点处继续传输,但我们很少知道它的原理。让我们来看看边肖的介绍。
断点续传的原理
其实断点续传的原理很简单,就是在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);
}
这些就是断点续传的原理。知道了这些原则,相信大家都能编程了。这项技术在今天的计算机技术中算不了什么。大家下载的时候要注意断点续传。