2015-05-12 40 views
0

我在兩個瀏覽器之間有一個數據通道連接,並且想要將文件拆分成塊並將它們發送到客戶端/從客戶端發送它們。創建用於通過WebRTC數據通道發送的二進制塊的元數據

我可以讀取文件並將其分解爲塊。然而,我需要一種方法讓接收客戶端知道

  1. 哪些文件涉及到數據塊(唯一標識符)。

  2. 哪個地方塊適用於重建(索引號)。

在瀏覽器中傳輸二進制數據時,似乎整個有效負載必須是二進制的。所以我不能,例如,創建一個具有上述屬性的JSON對象,並且具有data屬性和實際的二進制塊。

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

我該如何在瀏覽器中做到這一點?我做了很多谷歌搜索,但似乎無法找到任何關於此的信息,所以想知道我是否可以忽視某些可以幫助緩解這一過程的東西?

+0

只需使用[Uint8Array](https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array)等類型化數組構建自己的協議 – Robert

+0

您能否提供一個簡單的示例?我一直在閱讀有關用於處理二進制數據的各種JavaScript API,但我仍然很困惑,並且還沒有找到如何實現上述類似內容的可靠示例。 –

+0

請參閱下面的答案。我正在使用'Dart'而不是'JavaScript',所以我無法爲你提供一個例子。 – Robert

回答

5

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

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

    1. 創建滿足需要,例如協議:

      • 1字節:包類型(255種可能包類型)
      • 2字節:數據(2^16個字節的長度〜每塊數據)
      • n個字節的64KB:<數據>
    2. 硒找到一個初始包(例如類型0×01)

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

      • 你應該至少使用兩個字節的序列號
      • 數據如下之後(不需要長度,因爲你知道總長度)

注意:如果傳輸多個文件,您應該添加一個ID或其他東西。

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

+1

感謝您的概述,這就是我的想法,但看到它在更務實的意義上解釋有很多幫助! –

1

除了@ Robert的很好的答案,你可以使用channel.send(blob)(至少在Firefox < - > Firefox中)。最終,這也應該在Chrome中運行。

+0

這在Chrome中不起作用。 – Robert

+0

因此'最終':-) – jesup

0

如果是多個文件的簡單問題,那麼您可以爲每個新文件創建一個新的數據通道。

每個通道會照顧它自己的緩衝,序列等

喜歡的東西:

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

然後打破你的文件轉換成< 64K塊,並chan.send()他們按順序排列。

接收方可以獲取標籤,並用它來保存文件適當

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

附: 如果你真的必須通過單一通道使用文件系統協議(比如說因爲你想要隨機訪問行爲),不要發明一個新的,使用一個已經存在並且經過測試的文件 - 我喜歡從inferno/plan9開始的9p

相關問題