位置: 编程技术 - 正文

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

  • 个税汇算清缴怎么把全年一次性奖金并入综合所得
  • 当月只有进项税额月末怎么办
  • 纳税人识别号怎么看是不是一般纳税人
  • 协定税率的简称
  • 合同资产减值准备怎么计提
  • 现金股利什么时候发放
  • 2019小规模纳税人免征增值税政策
  • 工商年报填好后怎样公示
  • 建安企业核定征收税率多少
  • 抵扣认证发票时间
  • 营改增之后账务怎么处理
  • 收银系统已入库怎么操作
  • 微信提现手续费最新规定
  • 企业借个人款该交税吗
  • 上市公司个税手续流程
  • 发票上面税率地方为*号代表什么
  • 个人消费索要公司的钱
  • 个体工商户增值税税率2023年
  • 资产和利润表的关系
  • 进口增值税 海关
  • 销方开具红字发票流程
  • 工商年报需要什么数据
  • 增值税发票和收据的区别
  • 每个季度零申报需要做什么
  • windows10.0
  • windows10如何更改时间
  • 安装win11一直转圈要多久?
  • win10版本激活码
  • 苹果手机铃声删除在哪里
  • jinjia.exe进程
  • 显示器显示频率设置
  • phpif函数的使用方法
  • 长期应收款属于流动资产吗
  • 开发票为什么要对公账户?
  • 成本法下长期股权投资的处置
  • php如何连接sql server
  • 开发成本属于哪个会计准则
  • 前端环境部署到服务器开发环境
  • 缴纳税款滞纳金怎么算
  • 税费减免政策2020
  • 个体户一直未申请怎么办
  • 开启php
  • phpcms生成html
  • mysql 5.7.22安装教程
  • mysql启动器
  • 企业前期开办的费用怎么做会计分录
  • 应交增值税结转账务处理
  • 跨年租赁费会计分录
  • 采用账龄分析法计提坏账准备时,收到
  • 政府拆迁赔款会计上怎样做账
  • 回购股票并注销是利好吗
  • 施工企业开专票还是开普票好
  • 计提坏账准备不属于企业的或有事项
  • 维修费计入哪个账户
  • 包工包料怎么开13个点发票
  • 独立核算的重要性
  • 货物发出退货
  • 长期待摊费用怎么记账
  • sql server服务器模式
  • 笔记本带u
  • windows7没有声音怎么调
  • xp专业版激活工具
  • mac查看地址
  • linux限速
  • win7防火墙打不开错误代码6801
  • win7更改文件名的方法
  • debian怎么配置ip
  • cocos2dx官方教程
  • opengles和vulkan哪个好
  • jquery点击切换div
  • ecmascript6 官方文档
  • nodejs co
  • python组合运算
  • win10的安装方式有哪些
  • python中文分词库
  • 陕西国家税务总局官网登录入口
  • 工会经费支出审批制度
  • 诊所办理要求
  • 审计如何配合教师工作
  • 财务年中工作总结简短
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设