美文网首页
iOS 基于HTTP协议的断点续传

iOS 基于HTTP协议的断点续传

作者: Kevin追梦先生 | 来源:发表于2016-04-23 17:34 被阅读730次

> 原理

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

NSUrlConnection实现断点续传的关键是自定义http request的头部的range域属性。

Range头域

Range头域可以请求实体的一个或者多个子范围。例如,

表示头500个字节:bytes=0-499

表示第二个500字节:bytes=500-999

表示最后500个字节:bytes=-500

表示500字节以后的范围:bytes=500-

第一个和最后一个字节:bytes=0-0,-1

同时指定几个范围:bytes=500-600,601-999

但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)。

在ios中使用NSMutableURLRequest来定义头部域

NSURL *url1=[NSURL URLWithString:@"下载地址";

NSMutableURLRequest* request1=[NSMutableURLRequest requestWithURL:url1];

[request1 setValue:@"bytes=20000-" forHTTPHeaderField:@"Range"];

[request1 setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

NSData *returnData1 = [NSURLConnection sendSynchronousRequest:request1 returningResponse:nil error:nil];

[self writeToFile:returnData1 fileName:@"SOMEPATH"];

-(void)writeToFile:(NSData *)data fileName:(NSString *) fileName

{

NSString *filePath=[NSString stringWithFormat:@"%@",fileName];

if([[NSFileManager defaultManager] fileExistsAtPath:filePath] == NO){

NSLog(@"file not exist,create it...");

[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];

}else {

NSLog(@"file exist!!!");

}

FILE *file = fopen([fileName UTF8String], [@"ab+" UTF8String]);

if(file != NULL){

fseek(file, 0, SEEK_END);

}

int readSize = [data length];

fwrite((const void *)[data bytes], readSize, 1, file);

fclose(file);

}

相关文章

  • iOS 基于HTTP协议的断点续传

    > 原理 其实断点续传的原理很简单,就是在 Http 的请求上和一般的下载有所不同而已。 打个比方,浏览器请求服务...

  • ios 后台下载,断点续传总结

    断点续传 demo 断点续传的原理是在HTTP1.1协议(RFC2616)中定义了断点续传相关的HTTP头的Ran...

  • 01要求技术点

    关于网络 1.你对 http 协议chunk 协议如何断点续传分片上传 ssl 握手? http://blog.c...

  • HTTP与RPC

    协议 RPC指远程过程调用,是通常基于TCP协议,也可以基于HTTP协议HTTP基于HTTP协议 效率 由于HTT...

  • RPC接口与REST对比

    传输协议 RPC,可以基于TCP协议,也可以基于HTTP协议 REST,基于HTTP协议(在TCP协议之上进行封装...

  • Servlet学习笔记(二)

    HTTP协议 基于TCP连接的传输协议 默认端口是80 基于请求—响应模式的协议 HTTP协议的请求头 HTTP协...

  • HTTP协议断点续传

    HTTP协议从V1.1开始可以使用长链接和断点续传和其他新特性,断点续传也就是从下载中断的分块,重新进行下载,直到...

  • RPC和RESTful区别

    RPC主要是基于TCP/IP协议的,而HTTP服务主要是基于HTTP协议的,我们都知道HTTP协议是在传输层协议T...

  • “RPC好,还是RESTful好?”,这个问题不简单!

    PC主要是基于TCP/IP协议的,而HTTP服务主要是基于HTTP协议的,我们都知道HTTP协议是在传输层协议TC...

  • iOS面试题:Scoket连接和HTTP连接的区别:

    原文:iOS面试题大全 区别: HTTP协议是基于TCP连接的,是应用层协议,主要解决如何包装数据。Socket是...

网友评论

      本文标题:iOS 基于HTTP协议的断点续传

      本文链接:https://www.haomeiwen.com/subject/hmzxrttx.html