位置: 编程技术 - 正文

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

  • 关联方债务豁免需要缴纳所得税吗
  • 如何确定商品交易价格?
  • 企业开办时间是什么意思
  • 增值税普通发票怎么开
  • 营改增后个人所得税计税依据实例
  • 补提企业所得税会计分录
  • 员工迟到扣款该怎么处理
  • 会计上的未达账项是什么
  • 固定资产原值是含税还是不含税
  • 土地成本费用包括什么
  • 资产负债表是累计记账吗
  • 增值税发票二联折叠票样式
  • 销售不动产预收款纳税义务发生时间
  • 股东垫支开办费
  • 公司账户电子承兑
  • 六月工资七月发算不算压工资
  • 公司对外租赁
  • edge浏览器设置主页网址
  • 成本加成定价法包括()
  • 周围的材料分为哪几类
  • 公司上市前缩股
  • 汇算清缴申报表怎么填
  • 合并范围外关联方交易是否抵消
  • 商会收到的会费要交企业所得税
  • 公司债务转移的法律规定
  • 分级核算下的建议怎么写
  • 明细分类帐户
  • 税务机关为小规模纳税人
  • 现金日记账怎么记账
  • 小企业固定资产折旧方法包括
  • 推荐最好用的
  • css deep深度选择器
  • 小程序开发定制
  • python单链表的创建
  • 应收代垫款
  • db2之间的数据库迁移
  • 企业汇兑收益所得税税率
  • 计入当期损益的
  • 个人所得税租房专项扣除标准
  • mysql 5.5 5.6 5.7
  • 企业所得税资产总额季初季末怎么填
  • 发票开错抬头做红字发票的账务处理是?
  • 企业政策性搬迁所得税管理办法解读
  • 银行手续费发票负数是啥意思
  • 银行发放执行款多久到账
  • 企业计提什么意思
  • 存货报废计入
  • 预收账款计入应收账款怎么弄
  • 技术服务费计入主营业务成本
  • 包装物属于周转材料还是低值易耗品
  • 收到投资款现金流量
  • 限售股锁定期延长
  • 对公账户进出账常识
  • 法人的加油费能抵所得税吗
  • 会计应该怎么做职业规划
  • win10怎么用ghost
  • windows自动操作软件
  • linux中vi编辑器怎么使用
  • linux的telnet用法
  • u盘启动pe工具
  • 用指定用户名访问网络
  • windows8文件夹怎么加密
  • 怎么有才能
  • win7弹出cmd窗口瞬间消失
  • 用VMware安装阿里linux
  • windows7更新补丁后蓝屏
  • cocos2d怎么创建项目
  • js闭包的理解详解
  • jquery结合html实现中英文页面切换
  • 如何修改android studio的下载路径
  • unity怎么把文件导入项目
  • python引用和调用有什么不同
  • 辽宁省农村合作医疗2024怎么缴费
  • 如何加强税务系统财务管理工作
  • 注会证可以挂靠吗?挂靠合法吗?
  • 湖南税务局发票查询
  • 饲料的税收优惠政策
  • 国家税务总局云平台网址
  • 土地增值税逾期罚款
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设