设为首页 加入收藏

TOP

Node.js 中实现 HTTP 206 内容分片(一)
2014-11-23 21:26:38 来源: 作者: 【 】 浏览:28
Tags:Node.js 实现 HTTP 206 内容 分片

下载 PartialContent.zip - 2 KB


------------------------------------------分割线------------------------------------------


具体下载目录在 /2014年资料/9月/12日/Node.js 中实现 HTTP 206 内容分片


------------------------------------------分割线------------------------------------------


在本文中,我会阐述HTTP状态206 分部分内容 的基础概念,并使用Node.js一步步地实现它. 我们还将用一个基于它用法最常见场景的示例来测试代码:一个能够在任何时间点开始播放视频文件的HTML5页面.


HTTP 的 206 Partial Content 状态码和其相关的消息头提供了让浏览器以及其他用户代理从服务器接收部分内容而不是全部内容,这样一种机制. 这一机制被广泛使用在一个被大多数浏览器和诸如Windows Media Player和VLC Player这样的播放器所支持视频文件的传输上.


基础的流程可以用下面这几步描述:


让我们来看看这几个步骤中的每一个关键消息头.


Accept-Ranges: 字节(bytes)


这是会有服务器发送的字节头,展示可以被分部分发送给浏览器的内容. 这个值声明了可被接受的每一个范围请求, 大多数情况下是字节数 bytes.


Range: 字节数(bytes)=(开始)-(结束)


这是浏览器告知服务器所需分部分内容范围的消息头. 注意开始和结束位置是都包括在内的,而且是从0开始的. 这个消息头也可以不发送两个位置,其含义如下:


Content-Range:字节数(bytes)=(开始)-(结束)/(总数)


这个消息头将会跟随 HTTP 状态码 206 一起出现. 开始和结束的值展示了当前内容的范围. 跟 Range 消息头一样, 两个值都是包含在内的,并且也是从零开始的. 总数这个值声明了可用字节的总数.


Content-Range: */(总数)


这个头信息和上面一个是一样的,不过是用另一种格式,并且仅在返回HTTP状态码416时被发送。其中总数代表了正文总共可用的字节数。


这里有一对有2048个字节文件的例子。注意省略起点和重点的区别。


请求开始的1024个字节


浏览器发送:


GET /dota2/techies.mp4 HTTP/1.1
Host: localhost:8000
Range: bytes=0-1023


服务器返回:


HTTP/1.1 206 Partial Content
Date: Mon, 15 Sep 2014 22:19:34 GMT
Content-Type: video/mp4
Content-Range: bytes 0-1023/2048
Content-Length: 1024

(Content...)


没有终点位置的请求


浏览器发送:



GET /dota2/techies.mp4 HTTP/1.1
Host: localhost:8000
Range: bytes=1024-


服务器返回:


HTTP/1.1 206 Partial Content
Date: Mon, 15 Sep 2014 22:19:34 GMT
Content-Type: video/mp4
Content-Range: bytes 1024-2047/2048
Content-Length: 1024

(Content...)


注意:服务器并不需要在单个响应中返回所有剩下的字节,特别是当正文太长或者有其他性能的考虑。所以下面的两个例子在这种情况下也是可接受的:


Content-Range: bytes 1024-1535/2048
Content-Length: 512


服务器仅返回剩余正文的一半。下一次请求的范围将从第1536个字节开始。


Content-Range: bytes 1024-1279/2048
Content-Length: 256


服务器仅返回剩余正文的256个字节。下一次请求的范围将从第1280个字节开始。


请求最后512个字节


浏览器发送:


GET /dota2/techies.mp4 HTTP/1.1
Host: localhost:8000
Range: bytes=-512


服务器返回:


HTTP/1.1 206 Partial Content
Date: Mon, 15 Sep 2014 22:19:34 GMT
Content-Type: video/mp4
Content-Range: bytes 1536-2047/2048
Content-Length: 512

(Content...)


请求不可用的范围:


浏览器发送:



GET /dota2/techies.mp4 HTTP/1.1
Host: localhost:8000
Range: bytes=1024-4096


服务器返回:


HTTP/1.1 416 Requested Range Not Satisfiable
Date: Mon, 15 Sep 2014 22:19:34 GMT
Content-Range: bytes */2048


理解了工作流和头部信息后,现在我们可以用Node.js去实现这个机制。


第一步:创建一个简单的HTTP服务器


我们将像下面的例子那样,从一个基本的HTTP服务器开始。这已经可以基本足够处理大多数的浏览器请求了。首先,我们初始化我们需要用到的对象,并且用initFolder来代表文件的位置。为了生成Content-Type头部,我们列出文件扩展名和它们相对应的MIME名称来构成一个字典。在回调函数httpListener()中,我们将仅允许GET可用。如果出现其他方法,服务器将返回405 Method Not Allowed,在文件不存在于initFolder,服务器将返回404 Not Found


// 初始化需要的对象
var http = require("http");
var fs = require("fs");
var path = require("path");
var url = require("url");

// 初始的目录,随时可以改成你希望的目录
var initFolder = "C:\\Users\\User\\Videos";

// 将我们需要的文件扩展名和MIME名称列出一个字典
var mimeNames = {
".css": "text/css",
".html": "text/html",
".js": "application/java script",
".mp3": "audio/mpeg",
".mp4": "video/mp4",
".ogg": "application/ogg",
".ogv": "video/ogg",
".oga": "audio/ogg",
".txt": "text/plain",
".wav": "audio/x-wav",
".webm": "video/webm";
};

http.createServer(httpListener).listen(8000);

function httpListener (request, response) {
// 我们将只接受GET请求,否则返回405 'Method Not Allowed'
if (request.method != "GET") {
sendResponse

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇jQuery 网页局部打印总结 下一篇10个最“优秀”的代码注释

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: