位置: 编程技术 - 正文

使用Node.js实现HTTP 206内容分片的教程(nodejs如何运行html)

编辑:rootadmin

推荐整理分享使用Node.js实现HTTP 206内容分片的教程(nodejs如何运行html),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:使用node.js实现100以内的偶数,使用node.js实现100以内的偶数,node.js怎么用,使用node.js实现100以内的偶数,node.js使用教程,使用node.js实现爬取数据,使用node.js实现用IP地址查询天气情况,使用node.js实现用IP地址查询天气情况,内容如对您有帮助,希望把文章链接给更多的朋友!

介绍

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

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

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

浏览器请求内容. 服务器告诉浏览器,该内容可以使用 Accept-Ranges 消息头进行分部分请求. 浏览器重新发送请求,用 Range 消息头告诉服务器需要的内容范围.

服务器会分如下两种情况响应浏览器的请求:

如果范围是合理的,服务器会返回所请求的部分内容,并带上 Partial Content 状态码. 当前内容的范围会在 Content-Range 消息头中申明. 如果范围是不可用的(例如,比内容的总字节数大), 服务器会返回 请求范围不合理 Requested Range Not Satisfiable 状态码. 可用的范围也会在 Content-Range 消息头中声明.

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

Accept-Ranges: 字节(bytes)

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

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

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

如果结束位置被去掉了,服务器会返回从声明的开始位置到整个内容的结束位置内容的最后一个可用字节. 如果开始位置被去掉了,结束位置参数可以被描述成从最后一个可用的字节算起可以被服务器返回的字节数.

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

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

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

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

请求开始的个字节

浏览器发送:

服务器返回:

没有终点位置的请求

浏览器发送:

服务器返回:

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

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

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

请求最后个字节

使用Node.js实现HTTP 206内容分片的教程(nodejs如何运行html)

浏览器发送:

服务器返回:

请求不可用的范围:

浏览器发送:

服务器返回:

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

开始用Node.js实现

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

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

步骤 2 - 使用正则表达式捕获Range消息头

有了这个HTTP服务器做基础,我们现在就可以用如下代码处理Range消息头了. 我们使用正则表达式将消息头分割,以获取开始和结束字符串。然后使用 parseInt() 方法将它们转换成整形数. 如果返回值是 NaN (非数字not a number), 那么这个字符串就是没有在这个消息头中的. 参数totalLength展示了当前文件的总字节数. 我们将使用它计算开始和结束位置.

步骤 3 - 检查数据范围是否合理

回到函数 httpListener(), 在HTTP方法通过之后,现在我们来检查请求的数据范围是否可用. 如果浏览器没有发送 Range 消息头过来, 请求就会直接被当做一般的请求对待. 服务器会返回整个文件,HTTP状态将会是 OK. 另外我们还会看看开始和结束位置是否比文件长度更大或者相等. 只要有一个是这种情况,请求的数据范围就是不能被满足的. 返回的状态就将会是 Requested Range Not Satisfiable 而 Content-Range 也会被发送.

步骤 4 - 满足请求

最后使人迷惑的一块来了。对于状态 Partial Content, 我们有另外一种格式的 Content-Range 消息头,包括开始,结束位置以及当前文件的总字节数. 我们也还有 Content-Length 消息头,其值就等于开始和结束位置之间的差。在最后一句代码中,我们调用了 createReadStream() 并将开始和结束位置的值给了第二个参数选项的对象, 这意味着返回的流将只包含从开始到结束位置的只读数据.

下面是完整的 httpListener() 回调函数.

测试实现

我们怎么来测试我们的代码呢?就像在介绍中提到的,部分正文最常用的场景是流和播放视频。所以我们创建了一个ID为mainPlayer并包含一个<source/>标签的<video/>。函数onLoad()将在mainPlayer预读取当前视频的元数据时被触发,这用于检查在URL中是否有数字参数,如果有,mainPlayer将跳到指定的时间点。

现在我们把页面保存为"player.html"并和"dota2/techies.mp4"一起放在initFolder目录下。然后在浏览器中打开URL:

很有趣,对吧?当函数onLoad()改变currentTime属性的时候,浏览器计算这部视频秒处的字节位置。因为mainPlayer已经预加载了元数据,包括格式、比特率和其他基本信息,这个起始位置立刻就被得到了。之后,浏览器就可以下载并播放视频而不需要请求开头的秒了。成功了!

结论

我们已经用Node.js来实现支持部分正文的HTTP服务器端了。我们也用HTML5页面测试了。但这只是一个开始。如果你对头部信息和工作流这些都已经理解透彻了,你可以试着用其他像ASP.NET MVC或者WCF服务这类框架来实现它。但是不要忘记启动任务管理器来查看CPU和内存的使用。像我们在之前讨论到的,服务器没有在单个响应中返回所用剩余的字节。要找到性能的平衡点将是一项重要的任务。

使用Raygun对Node.js应用进行错误处理的方法 用我们的raygun4node包,能提供一种把您的Node.js错误发送给Raygun的便利办法.它可以很容仪的使用npm安装:npminstallraygun其能给您提供一个raygun客户端,您可

使用Node.js为其他程序编写扩展的基本方法 准备开始首先我们用下面的目录结构来创建一个节点通知(node-notify)文件夹..|--build/#Thisiswhereourextensionisbuilt.|--demo/|`--demo.js#ThisisademoNode.jsscripttotestourextensi

Windows系统下Node.js的简单入门教程 随着近日Paypal和Netflix宣告迁移到Node.js,服务器端Javascript平台已经证明其自身在企业领域的价值.这对于Node来说是一小步,对于Javascript而言却是一大跨越

标签: nodejs如何运行html

本文链接地址:https://www.jiuchutong.com/biancheng/377981.html 转载请保留说明!

上一篇:在Node.js中使用HTTP上传文件的方法(node.js适用哪些场景)

下一篇:使用Raygun对Node.js应用进行错误处理的方法

  • 一般进口货物的完税价格如何确定
  • 未分配利润具体内容
  • 进项税额比销项税额大怎么办
  • 超过两年记入错误的主营业务成本怎么调账
  • 公司注销后持股要交税吗
  • 报关单境外收货人和合同不一致
  • 连锁店每个店都要独立核算吗
  • 政府购买服务合同最多签几年
  • 自然人合伙企业怎么交税
  • 固定资产遭受自然灾害账务处理
  • 外资企业变内资流程
  • 企业所得税汇算清缴退税账务处理
  • 兼营免税减税项目
  • 税控盘费用抵减增值税
  • 向境外企业转让房产
  • 应交税金负数如何调整
  • 开具房租发票备注多少
  • 预缴税金跨区域涉税在哪查询
  • 企业一次性支付多年费用 不摊销
  • 初始投资成本与可辨认净资产公允价值
  • 房地产销售佣金表格模板
  • 购买公司付款会计分录
  • steam打开速度
  • 应收账款账面价值小于计税基础
  • 盈余公积的来源及主要用途包括哪些
  • 个人所得税租房和房贷只能二选一吗
  • 上年度的费用今年怎么算
  • 工厂没有生产许可证可以生产吗
  • 餐饮发票可以计入研发费用吗
  • 爱奇艺以图搜剧不见了
  • php连接mysql查询数据
  • php字符串变量
  • 补充协议是否缴纳印花税
  • 对视同销售行为应如何进行税务处理
  • 公允价值变动损益会计处理
  • echart怎么用
  • php rediscluster
  • 海浪冲击着海岸
  • mysql_escape_string()函数用法分析
  • 解决脱发的8个方法
  • vue 跳转页面
  • 图像识别算法
  • 销售固定资产是属于销售货物吗?
  • 现金的盘亏的账务处理
  • 一般纳税人普通发票做账
  • java一维数组从小到大排序
  • MicrosoftSQLserver2014
  • 建筑安装的扩展性是指
  • 免征增值税政策的政策有哪些?
  • 转月是下个月的意思吗
  • 差旅费报销原因
  • 工程奖金计入什么科目
  • 经营租赁属于什么收入
  • 应付票据与应付账款增长的多的逃税问题
  • 独立核算和非独立核算增值税
  • 快递行业的会计岗位
  • 企业借款的利息交增值税吗
  • 出口转内销账务处理以前年度
  • 正确使用显微镜的七个步骤
  • centos中rpm包怎么安装
  • freebsd服务器搭建
  • avserve2.exe是什么东东
  • DWHeartbeatMonitor.exe进程是什么意思 DWHeartbeatMonitor是安全的进程吗
  • win8账户
  • 文件fwpkc1nt.sys
  • 电脑审核策略更改是什么意思
  • win7破解版和正版的区别
  • winxp虚拟内存怎么改
  • cocos2d游戏源码
  • firefox下rowspan+border+border-collapse的bug
  • jquery ztree api
  • 网页设计需要多少分辨率
  • jQuery+ajax实现文章点赞功能的方法
  • jquery defaultvalue
  • python中的range和arange
  • under code
  • Android之fill_parent和wrap_content
  • 国税申报密码可以输几次
  • 省委巡视组收到的案件线索怎么分配
  • 电费增值税专用发票如何抵税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设