簡體   English   中英

為二進制塊創建元數據以通過WebRTC數據通道發送

[英]Creating meta-data for binary chunks for sending via WebRTC datachannel

我在兩個瀏覽器之間建立了數據通道連接,並希望將文件拆分為多個塊,然后將其發送到客戶端或從客戶端發送出去。

我可以讀取文件並將其分解為幾塊。 但是我需要一種讓接收客戶知道的方法

  1. 數據塊與哪個文件有關(唯一標識符)。

  2. 該塊適用於重建的哪個位置(索引號)。

在瀏覽器中傳輸二進制數據時,似乎整個有效負載必須是二進制的。 因此,例如,我無法創建具有上述屬性的JSON對象,而無法擁有具有實際二進制塊的data屬性。

我想我需要將文件塊包裝到包含標識符和索引的輔助二進制blob中。 然后,接收方客戶端將解碼第一個包裝塊,以檢查元數據,然后根據該信息處理實際文件塊。

如何在瀏覽器中執行此操作? 我已經做了很多Google搜索,但是似乎找不到任何信息,所以想知道我是否正在忽略一些可以簡化此過程的信息嗎?

您必須創建自己的協議來傳輸文件。

  1. 我假設您有一個File / Blob對象。 您可能還使用split()方法獲取塊。
  2. 您可以簡單地使用Uint8Array傳輸數據。

    1. 創建一個滿足您需求的協議,例如:

      • 1個字節:包類型(255個可能的包類型)
      • 2個字節:數據長度(每塊2 ^ 16字節〜64KB數據)
      • n個字節:<Data>
    2. 發送初始包(例如,類型0x01)

      • 數據包含一些信息(全部或部分):
        • Blob /文件的總長度
        • 文件類型
        • 塊大小
        • 塊數
        • 文檔名稱
        • ...
    3. 發送數據塊(例如,類型0x02)

      • 序列號至少應使用兩個字節
      • 此后會跟隨數據(不需要長度,因為您知道總長度)

注意 :如果要傳輸多個文件,則應添加一個ID或其他名稱。

在接收方,您可以等待初始包並創建一個具有總文件長度的新Uint8Array 之后,您可以使用set()在塊位置添加接收到的數據(偏移量= 0-based-chunk-number * chunk-size )。 收到所有塊后,您可以創建Blob

除了@Robert的非常好的答案之外,您還可以使用channel.send(blob)(至少在Firefox <-> Firefox中)。 最終,這也應該在Chrome中也可以使用。

如果僅涉及多個文件,則可以為每個新文件創建一個新的數據通道。

每個通道都會照顧自己的緩沖,順序等。

就像是:

chan = peerCon.createDataChannel("/somedir/somefile", props);

然后將文件分成<64k個塊,並chan.send()它們進行chan.send()

接收方可以獲取標簽並使用它適當地保存文件

peerCon.ondatachannel = function(channel) {
     console.log("New file " + channel.label);
     channel.onmessage = function(

等等

PS:如果您確實必須在單個通道上使用文件系統協議(例如,因為您想要隨機訪問行為),請不要發明新的協議,請使用已經存在並經過測試的協議-我喜歡inferno / plan9的9p

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM