位置: 编程技术 - 正文

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

  • 预缴增值税计算公式方法
  • 实际出资人享有什么权利
  • 小规模计提增值税
  • 一般纳税人降为小规模还能升为一般纳税人吗
  • 汇票贴现的账务处理
  • 当月发票不够用领用了下个月,下个月还能再领吗
  • 土地使用权计入存货吗
  • 购买非专利技术发生的手续费计入什么科目
  • 帮客人清关的费用如何做会计核算合适呢?
  • 取得成本发票
  • 开出转账支票的摘要怎么写
  • 不得抵扣的进项税额怎么处理
  • 异常增值税扣税凭证
  • 工资薪金所得的个人所得税筹划方法
  • 作废已开具的普通发票
  • 多计提的社保费,可否计入营业外收入
  • 计提应收票据利息怎么算
  • 营改增后兼营非应税劳务的税务处理怎么做?
  • 公司作为二房东怎么给别人开发票
  • 建筑企业分包工程的纳税人
  • 辅导费是什么
  • 为什么win7系统用不了谷歌浏览器了
  • RAVMOND.exe - RAVMOND是什么进程.有什么作用
  • 收到服务费的发票怎么做
  • 应收账款转让的风险
  • 主营业务收入发生额在哪方
  • springboot整合了哪些框架
  • 收到业绩补偿会扣税吗
  • 投资利润率用什么表示
  • 基建借款属于什么科目
  • 微信小程序解决跨域问题
  • pnp算法简介与代码解析
  • WINDOWS10系统怎样给电脑分区
  • 演员片酬要分给经纪公司吗
  • 公司开的餐费专票可以抵扣吗
  • 职工探亲如何报差旅费
  • java获取resources下文件路径
  • sql server概述
  • sql 列数
  • 非民营企业会计账务处理
  • centos执行sh
  • 收据十万大写金额填写样本
  • 计提税金如何做凭证
  • 跨年预收账款被税局要求确认收入怎么交增值税
  • 私车公用协议可以过户吗
  • 劳务报酬所得如何申报
  • 办公设备维修费会计分录
  • 完工不拨付工程款怎么处理
  • 销售返利怎么做税务处理
  • 融资租赁资产承租人的账务处理
  • 结算本月应付职工工资,其中生产工人工资8000元
  • 结转存货跌价准备是什么意思
  • 员工体检费发票怎么入账
  • 无形资产如何入股公司
  • 建账选用什么会计制度
  • mysql安装过程中报错
  • linux系统关机重启命令
  • vmware虚拟机怎么克隆
  • 重装win7系统后鼠标反应慢
  • 安装并激活navicat
  • Windows 8.1 with Update MSDN简体/繁体中文原版下载地址与安装密匙
  • win8.1系统更新后启动不了
  • centos配置httpd
  • win8开机进不了桌面
  • javascript运用
  • 显示打包成功但是没有文件
  • java密码强度检验工具
  • unity延迟调用函数
  • nodejs例子
  • js 竖线
  • 日本的消费税是累进税吗
  • 2023年内蒙古房贷利率
  • 柴油计入什么科目
  • 购车绿本是什么样的?
  • 征管基础平台app
  • 银行缴纳印花税存在问题和建议
  • 买二套房契税可退税吗
  • 青岛税务局局长是什么级别?
  • 税收负担与税负转嫁
  • 苏30参数
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设