zoukankan      html  css  js  c++  java
  • 简述Asp.net中断点续传的原理与实现

    在了解HTTP断点续传的原理之前,让我们先来了解一下HTTP协议,HTTP协议是一种基于tcp的简单协议,分为请求和回复两种。请求协议是由客户机(浏览器)向服务器(WEB SERVER)提交请求时发送报文的协议。回复协议是由服务器(web server),向客户机(浏览器)回复报文时的协议。请求和回复协议都由头和体组成。头和体之间以一行空行为分隔。

    以下是一个请求报文与相应的回复报文的例子:

    GET /image/index_r4_c1.jpg HTTP/1.1

    Accept: */*

    Referer: http://192.168.3.120:8080

    Accept-Language: zh-cn

    Accept-Encoding: gzip, deflate

    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)

    Host: 192.168.3.120:8080

    Connection: Keep-Alive

    HTTP/1.1 200 OK

    Server: Microsoft-IIS/5.0

    Date: Tue, 24 Jun 2003 05:39:40 GMT

    Content-Type: image/jpeg

    Accept-Ranges: bytes

    Last-Modified: Thu, 23 May 2002 03:05:40 GMT

    ETag: "bec48eb862c21:934"

    Content-Length: 2827

    ….

      顾名思义,断点续传就是在上一次下载时断开的位置开始继续下载。在HTTP协议中,可以在请求报文头中加入Range段,来表示客户机希望从何处继续下载。

      比如说从第1024字节开始下载,请求报文如下:

    GET /image/index_r4_c1.jpg HTTP/1.1

    Accept: */*

    Referer: http://192.168.3.120:8080

    Accept-Language: zh-cn

    Accept-Encoding: gzip, deflate

    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)

    Host: 192.168.3.120:8080

    Range:bytes=1024-

    Connection: Keep-Alive

    相应的响应报文为

    HTTP/1.1 206 Partial Content

    Server: Microsoft-IIS/5.0

    Date: Tue, 24 Jun 2003 05:39:40 GMT

    Content-Type: image/jpeg

    Accept-Ranges: bytes

    Last-Modified: Thu, 23 May 2002 03:05:40 GMT

    ETag: "bec48eb862c21:934"

    Content-Length: 1803

    Content-Range: bytes 1024-1803/2827

    通过两段不同的报文可以看到,在断点续传时,我们只要能给客户端相应相应的报文,使客户端能正确响应,并且传送续传点后的部分文件即可实现断点续传。

    1. 区分断点续传报文。

      由于断点续传报文中含有Range字段,因此,只要通过Request.Headers["Range"]是否为null即可。

    2. 发送正确的续传响应报文

      两次响应报文不同的部分在报文中已经用红色部分标识出来,只需修改红色部分报文头,便能发送正确的续传报文。

    3. 传送正确的文件部分

      续传的时候只需要传送续传点之后的文件即可,首先通过请求报文中的Range字段获取文件的开始位置,传送文件的时候只需要传送该位置之后的部分即可。

      下面的代码示例显示了一个可以支持断点续传的 ASP.NET 页

     

  • 相关阅读:
    Python的time模块随笔。
    生成器递归解决八皇后问题(勉强理解)
    Python历史「解密」Python底层逻辑 及Python 字节码介绍(转帖)
    可迭代(Interable),迭代器(Iterator),生成器(generator)的手记(11月26日再次修改)
    __getattr__,__setattr__,__delattr__,__getattribute__,记录
    关于property的一些记录,以及描述符(descriptor)中__get__,__set__,__delete__的属性使用。
    Python魔法方法之容器部方法(__len__,__getitem__,__setitem__,__delitem__,__missing__)(更新版本)
    Mac下PyCharm快捷键大全!(每天记住几个)
    开笔了,就写一下,hasattr,getattr,setattr。
    GUI
  • 原文地址:https://www.cnblogs.com/TianFang/p/499015.html
Copyright © 2011-2022 走看看