最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

使用Node.js實(shí)現(xiàn)HTTP206內(nèi)容分片的教程_node.js

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 21:39:47
文檔

使用Node.js實(shí)現(xiàn)HTTP206內(nèi)容分片的教程_node.js

使用Node.js實(shí)現(xiàn)HTTP206內(nèi)容分片的教程_node.js: 介紹 在本文中,我會闡述HTTP狀態(tài)206 分部分內(nèi)容 的基礎(chǔ)概念,并使用Node.js一步步地實(shí)現(xiàn)它. 我們還將用一個(gè)基于它用法最常見場景的示例來測試代碼:一個(gè)能夠在任何時(shí)間點(diǎn)開始播放視頻文件的HTML5頁面. Partial Content 的簡要介紹 HTTP 的 2
推薦度:
導(dǎo)讀使用Node.js實(shí)現(xiàn)HTTP206內(nèi)容分片的教程_node.js: 介紹 在本文中,我會闡述HTTP狀態(tài)206 分部分內(nèi)容 的基礎(chǔ)概念,并使用Node.js一步步地實(shí)現(xiàn)它. 我們還將用一個(gè)基于它用法最常見場景的示例來測試代碼:一個(gè)能夠在任何時(shí)間點(diǎn)開始播放視頻文件的HTML5頁面. Partial Content 的簡要介紹 HTTP 的 2
介紹

在本文中,我會闡述HTTP狀態(tài)206 分部分內(nèi)容 的基礎(chǔ)概念,并使用Node.js一步步地實(shí)現(xiàn)它. 我們還將用一個(gè)基于它用法最常見場景的示例來測試代碼:一個(gè)能夠在任何時(shí)間點(diǎn)開始播放視頻文件的HTML5頁面.
Partial Content 的簡要介紹

HTTP 的 206 Partial Content 狀態(tài)碼和其相關(guān)的消息頭提供了讓瀏覽器以及其他用戶代理從服務(wù)器接收部分內(nèi)容而不是全部內(nèi)容,這樣一種機(jī)制. 這一機(jī)制被廣泛使用在一個(gè)被大多數(shù)瀏覽器和諸如Windows Media Player和VLC Player這樣的播放器所支持視頻文件的傳輸上.

基礎(chǔ)的流程可以用下面這幾步描述:

  • 瀏覽器請求內(nèi)容.
  • 服務(wù)器告訴瀏覽器,該內(nèi)容可以使用 Accept-Ranges 消息頭進(jìn)行分部分請求.
  • 瀏覽器重新發(fā)送請求,用 Range 消息頭告訴服務(wù)器需要的內(nèi)容范圍.
  • 服務(wù)器會分如下兩種情況響應(yīng)瀏覽器的請求:

  • 如果范圍是合理的,服務(wù)器會返回所請求的部分內(nèi)容,并帶上 206 Partial Content 狀態(tài)碼. 當(dāng)前內(nèi)容的范圍會在 Content-Range 消息頭中申明.
  • 如果范圍是不可用的(例如,比內(nèi)容的總字節(jié)數(shù)大), 服務(wù)器會返回 416 請求范圍不合理 Requested Range Not Satisfiable 狀態(tài)碼. 可用的范圍也會在 Content-Range 消息頭中聲明.
  • 讓我們來看看這幾個(gè)步驟中的每一個(gè)關(guān)鍵消息頭.

    Accept-Ranges: 字節(jié)(bytes)

    這是會有服務(wù)器發(fā)送的字節(jié)頭,展示可以被分部分發(fā)送給瀏覽器的內(nèi)容. 這個(gè)值聲明了可被接受的每一個(gè)范圍請求, 大多數(shù)情況下是字節(jié)數(shù) bytes.


    Range: 字節(jié)數(shù)(bytes)=(開始)-(結(jié)束)

    這是瀏覽器告知服務(wù)器所需分部分內(nèi)容范圍的消息頭. 注意開始和結(jié)束位置是都包括在內(nèi)的,而且是從0開始的. 這個(gè)消息頭也可以不發(fā)送兩個(gè)位置,其含義如下:

  • 如果結(jié)束位置被去掉了,服務(wù)器會返回從聲明的開始位置到整個(gè)內(nèi)容的結(jié)束位置內(nèi)容的最后一個(gè)可用字節(jié).
  • 如果開始位置被去掉了,結(jié)束位置參數(shù)可以被描述成從最后一個(gè)可用的字節(jié)算起可以被服務(wù)器返回的字節(jié)數(shù).
  • Content-Range:字節(jié)數(shù)(bytes)=(開始)-(結(jié)束)/(總數(shù))

    這個(gè)消息頭將會跟隨 HTTP 狀態(tài)碼 206 一起出現(xiàn). 開始和結(jié)束的值展示了當(dāng)前內(nèi)容的范圍. 跟 Range 消息頭一樣, 兩個(gè)值都是包含在內(nèi)的,并且也是從零開始的. 總數(shù)這個(gè)值聲明了可用字節(jié)的總數(shù).

    Content-Range: */(總數(shù))

    這個(gè)頭信息和上面一個(gè)是一樣的,不過是用另一種格式,并且僅在返回HTTP狀態(tài)碼416時(shí)被發(fā)送。其中總數(shù)代表了正文總共可用的字節(jié)數(shù)。

    這里有一對有2048個(gè)字節(jié)文件的例子。注意省略起點(diǎn)和重點(diǎn)的區(qū)別。

    請求開始的1024個(gè)字節(jié)

    瀏覽器發(fā)送:

    服務(wù)器返回:

    沒有終點(diǎn)位置的請求

    瀏覽器發(fā)送:

    服務(wù)器返回:


    注意:服務(wù)器并不需要在單個(gè)響應(yīng)中返回所有剩下的字節(jié),特別是當(dāng)正文太長或者有其他性能的考慮。所以下面的兩個(gè)例子在這種情況下也是可接受的:

    服務(wù)器僅返回剩余正文的一半。下一次請求的范圍將從第1536個(gè)字節(jié)開始。


    服務(wù)器僅返回剩余正文的256個(gè)字節(jié)。下一次請求的范圍將從第1280個(gè)字節(jié)開始。


    請求最后512個(gè)字節(jié)

    瀏覽器發(fā)送:

    服務(wù)器返回:

    請求不可用的范圍:

    瀏覽器發(fā)送:

    服務(wù)器返回:

    理解了工作流和頭部信息后,現(xiàn)在我們可以用Node.js去實(shí)現(xiàn)這個(gè)機(jī)制。

    開始用Node.js實(shí)現(xiàn)

    第一步:創(chuàng)建一個(gè)簡單的HTTP服務(wù)器

    我們將像下面的例子那樣,從一個(gè)基本的HTTP服務(wù)器開始。這已經(jīng)可以基本足夠處理大多數(shù)的瀏覽器請求了。首先,我們初始化我們需要用到的對象,并且用initFolder來代表文件的位置。為了生成Content-Type頭部,我們列出文件擴(kuò)展名和它們相對應(yīng)的MIME名稱來構(gòu)成一個(gè)字典。在回調(diào)函數(shù)httpListener()中,我們將僅允許GET可用。如果出現(xiàn)其他方法,服務(wù)器將返回405 Method Not Allowed,在文件不存在于initFolder,服務(wù)器將返回404 Not Found。

    步驟 2 - 使用正則表達(dá)式捕獲Range消息頭

    有了這個(gè)HTTP服務(wù)器做基礎(chǔ),我們現(xiàn)在就可以用如下代碼處理Range消息頭了. 我們使用正則表達(dá)式將消息頭分割,以獲取開始和結(jié)束字符串。然后使用 parseInt() 方法將它們轉(zhuǎn)換成整形數(shù). 如果返回值是 NaN (非數(shù)字not a number), 那么這個(gè)字符串就是沒有在這個(gè)消息頭中的. 參數(shù)totalLength展示了當(dāng)前文件的總字節(jié)數(shù). 我們將使用它計(jì)算開始和結(jié)束位置.


    步驟 3 - 檢查數(shù)據(jù)范圍是否合理

    回到函數(shù) httpListener(), 在HTTP方法通過之后,現(xiàn)在我們來檢查請求的數(shù)據(jù)范圍是否可用. 如果瀏覽器沒有發(fā)送 Range 消息頭過來, 請求就會直接被當(dāng)做一般的請求對待. 服務(wù)器會返回整個(gè)文件,HTTP狀態(tài)將會是 200 OK. 另外我們還會看看開始和結(jié)束位置是否比文件長度更大或者相等. 只要有一個(gè)是這種情況,請求的數(shù)據(jù)范圍就是不能被滿足的. 返回的狀態(tài)就將會是 416 Requested Range Not Satisfiable 而 Content-Range 也會被發(fā)送.


    步驟 4 - 滿足請求

    最后使人迷惑的一塊來了。對于狀態(tài) 216 Partial Content, 我們有另外一種格式的 Content-Range 消息頭,包括開始,結(jié)束位置以及當(dāng)前文件的總字節(jié)數(shù). 我們也還有 Content-Length 消息頭,其值就等于開始和結(jié)束位置之間的差。在最后一句代碼中,我們調(diào)用了 createReadStream() 并將開始和結(jié)束位置的值給了第二個(gè)參數(shù)選項(xiàng)的對象, 這意味著返回的流將只包含從開始到結(jié)束位置的只讀數(shù)據(jù).

    下面是完整的 httpListener() 回調(diào)函數(shù).



    測試實(shí)現(xiàn)

    我們怎么來測試我們的代碼呢?就像在介紹中提到的,部分正文最常用的場景是流和播放視頻。所以我們創(chuàng)建了一個(gè)ID為mainPlayer并包含一個(gè)標(biāo)簽的


    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    使用Node.js實(shí)現(xiàn)HTTP206內(nèi)容分片的教程_node.js

    使用Node.js實(shí)現(xiàn)HTTP206內(nèi)容分片的教程_node.js: 介紹 在本文中,我會闡述HTTP狀態(tài)206 分部分內(nèi)容 的基礎(chǔ)概念,并使用Node.js一步步地實(shí)現(xiàn)它. 我們還將用一個(gè)基于它用法最常見場景的示例來測試代碼:一個(gè)能夠在任何時(shí)間點(diǎn)開始播放視頻文件的HTML5頁面. Partial Content 的簡要介紹 HTTP 的 2
    推薦度:
    標(biāo)簽: http 206 node.js
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top