linux断点续传程序,Linux下实现断点续传的原理介绍_Long Yu的博客-程序员宅基地

技术标签: linux断点续传程序  

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

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

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

断点续传的原理

其实断点续传的原理很简单,就是在 Http 的请求上和一般的下载有所不同而已。

打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:

假设服务器域名为 ,文件名为 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(“/down.zip”);

HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection();

// 设置 User-Agent

httpConnection.setRequestProperty(“User-Agent”,“NetFox”);

// 设置断点续传的开始位置

http Connection.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);

}

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30996983/article/details/116690351

智能推荐

【NOIP practice】BSOJ 3851 计算概率 智力题——加法原理_卡评测大师的博客-程序员宅基地

3851 -- 【模拟试题】计算概率Description  小明有n个长度不一的小木棍,这些木棍的长度都是正整数。小明的父亲想和小明做一个游戏。他规定一个整数长度l,让小明闭着眼睛从n个木棍中随便拿出两个。如果两个木棍的长度总和小于等于l,则小明胜,否则小明的父亲胜。小明想知道他胜出的概率究竟有多大。Input  输入包含两行。第一行为两个整数n和l,其中n和l都不超过10000

Parallels + Nutanix = 中小企业 VDI_weixin_34391854的博客-程序员宅基地

Parallels于近日宣布针对虚拟桌面与应用交付推出全新Nutanix Ready解决方案,旨在为中小企业提供更加简便和经济的IT基础设施与应用生命周期。Parallels Remote Application Server是一款专为Nutanix 企业云打造的Nutanix Ready解决方案,已于近日正式面市。相比传统的虚拟桌面与应用交付解决方案...

mysql中l开头的关键字_mysql数据库概念_好大夫在线的博客-程序员宅基地

数据库查询知识1、 导入hellodb.sql生成数据库[[email protected] ~]# mysql -S /home/app/yanglie/3308/socket/mysql.sock < hellodb_innodb.sqlMariaDB [(none)]> show databases;+--------------------+| Database ...

Google Wifi路由器测试报告新鲜出炉_weixin_34236869的博客-程序员宅基地

对于即将开售的Google Wifi路由器来说,广大消费者最为关心的恐怕还是它的无线性能究竟如何。为了展示“肌肉”,谷歌请来了美国第三方消费电子测试机构Allion USA,对自家产品进行了无线传输、信号覆盖等方面的测试,同时对比目前两款美国市面上流行的无线路由器产品——Luma和Eero。  Google Wifi测试在一个面积为3000平方英尺...

Android的跨进程通信_Jack-Chan的博客-程序员宅基地

Android系统的跨进程简介为什么不能直接跨进程通信?为了安全考虑,应用之间的内存是无法互相访问的,各自的数据都存在于自身的内存区域内。如何跨进程通信?要想跨进程通信,就要找到一个大家都能访问的地方,例如硬盘上的文件,多个进程都可以读写该文件,通过对该文件进行读写约定好的数据,来达到通信的目的。Android中的跨进程通信采用的是Binder机制,其底层原理是共享内存。Binder机制Andro

wpf制作分页控件_爱吃饺子的猫猫的博客-程序员宅基地

wpf制作分页控件最近在学习新的项目,看到一些用winform制作的分页控件,于是想研究下wpf制作的分页控件,在网上也看到了一些,不想说其中的好坏,只是觉得对于初学者可能理解起来并不是很容易,于是根据自己的理解,将自己做的控件跟大家分享,并附上调用实例。 这是我做的分页控件,前台代码如下:<UserControl x:Class="WpfApplication1.PageControl"

随便推点

解决Ubuntu安装Mysql时没有提示设置密码的问题_叫码农就行的博客-程序员宅基地_ubuntu安装mysql没有设置密码

Ubuntu安装Mysql时没有提示设置密码问题经过了好几个小时的查找资料,终于设置好了。参考了解决Ubuntu安装Mysql时为设置密码1. 打开/etc/mysql/debian.cnf文件,在这个文件中有系统默认给我们分配的用户名和密码,通过这个密码就可以直接对MySQL进行操作了。$sudo vim /etc/mysql/debian.cnf可以看到里面有:u...

《程序员的呐喊》_weixin_34186950的博客-程序员宅基地

TL;DR读完这本书,虽然我认可作者的大部分观点,但是凝神一下,让我感触更多的是,我离优秀的程序员还差很远很远。不过我感到庆幸的是,我一直保持着对计算机的思考和好奇,这份兴趣,让我的坚持,一路充满着迷茫、惊喜和快乐!I’m not a real programmer, but I do my best. “程序员这门...

Windows常用工具_sail0323的博客-程序员宅基地

Win工具:ProcessMonitor、VMMap、Procdump、Debuggers_windbg、leakdiag下载地址:http://ftpmirror.your.org/pub/misc/ftp.microsoft.com/PSS/Tools/Developer%20Support%20Tools/https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-utilities也可以百度网盘取..

SM3算法的C++实现(代码)_清梦长安的博客-程序员宅基地_sm3算法实现

文章目录一、SM3算法原理二、SM3算法的C++代码实现三、SM3算法的实现结果(给了文档里两个示例的运行结果)1.当输入数据值“abc”时候的实验结果:2.当输入数据值为“abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd”时候的实验结果:总结一、SM3算法原理SM3密码杂凑算法文档文档中对于SM3密码杂凑算法描述得十分清楚。整个算法主要涉及了两个主要的函数:填充函数、迭代压缩函数。迭代压缩函数包括两部分的内容:消.

ExecScan系列_fgh431的博客-程序员宅基地

ExecScan/* ---------------------------------------------------------------- * Scans the relation using the 'access method' indicated and * returns the next qualifying tuple in the direction specified * in the global variable ExecDirection. * The a

docker安装PHP redis扩展_sq_tomorrow的博客-程序员宅基地_docker php redis扩展

docker-php-ext-install 使用来安装php扩展的,这个命令属于下载并安装到php扩展比如安装mysqldocker-php-ext-install mysql安装redis$ curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/3.1.3.tar.gz$ tar xfz /tmp/redis.tar.gz$ rm -r /tmp/redis.tar.gz$ mkdir -p /