位置: 编程技术 - 正文

使用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应用进行错误处理的方法

  • 增值税有哪几类
  • 车辆购置税会计核算
  • 工资记借方还是贷方
  • 冲红的发票要拿回来吗
  • 哪些发票可以抵扣增值税
  • 怎么确定开票项目是否属于经营范围
  • 超市卡发票可以抵扣吗
  • 补缴所得税的账务处理
  • 开超市加盟费多少
  • 期货平仓费用
  • 交通补贴和通讯补贴怎么发合理
  • 安全费用中的固定资产如何写会计分录?
  • 贴现利息的计算题
  • 企业维修厂房购进材料怎样做账务处理?
  • 暂估收入是否暂列金额
  • 开具正规发票和不开发票对企业纳税的影响有什么不同?
  • 小规模季度超过30万怎么填报增值税
  • 在产品的成本
  • 多扣除了应交税费怎么调整?
  • 外购产品检验流程
  • 采用支票结算方式的基本业务处理程序
  • 应收票据收到了吗
  • 其他业务收入借贷方向会计分录
  • iphone无法打开网页怎么办
  • win11系统的电脑中拷贝到U盘中的文件没有了怎么解决
  • 工伤保险的作用有
  • 企业的债权资产
  • 超市一般纳税人账务处理
  • PHP调用API
  • PHP:xml_parser_create()的用法_XML解析器函数
  • linux中链接
  • 购买材料时采购会计分录
  • 购买性支出和转移性支出都计入GDP
  • 赠送现金券是否违法
  • 解决科学文化领域的矛盾应坚持的方针是
  • 建设期需要流动资金吗
  • 进项税加计抵扣10%和15%
  • vue 响应式自适应布局
  • php socket编程
  • 合作社计提工资
  • 对公账户走账是怎么回事
  • 劳务公司成本怎么算
  • 报税金额和开票统计不一致
  • wordpress woocommerce 建站
  • 二季度报表是累计数吗
  • 如何让网站优化成功
  • 汇算清缴需要做账吗
  • 捐款怎么组织
  • 甲公司购入一台不需要安装
  • 公司借个人借款协议书范本
  • 运输费用抵扣
  • 通货膨胀溢价的英文
  • 公司跟个体户的税收
  • 贷款调查的主要内容
  • 开办费企业所得税处理
  • 企业代办业务有哪些
  • 员工在异地缴纳社保,公司还能上吗
  • 火车票抵扣进项税怎么申报
  • 财务会计与管理会计的区别与联系?谁更棒?
  • 固定资产折旧算现金流入吗
  • 个体户建账吗
  • 职工教育经费的差旅费可以抵扣吗
  • 利用phpmyadmin写shell的方法
  • win10预览版21301bug
  • win8的系统
  • win10修改启动
  • lua struct
  • Qt Quick + OpenGL + Bullet初次测试
  • 如何提取api
  • unity中播放视频
  • 配置ip地址的方法有哪几种
  • mysql数据表复制
  • javascript运行速度
  • js实现复制文本
  • amd模拟intel
  • javascript如何写操作命令
  • 报考国税
  • 法制建设包括哪三个方面
  • 小规模纳税人销售自己使用过固定资产
  • 办税服务厅是税收工作的
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设