为二进制块创建元数据,以便通过WebRTC数据通道发送

时间:2015-05-12 13:56:58

标签: javascript browser blob webrtc rtcdatachannel

我在两个浏览器之间有一个数据通道连接,并希望将文件分成多个块并将它们发送到客户端或从客户端发送。

我可以读取文件并将其分解成块。但是我需要一种方法让接收客户知道

  1. 数据块所涉及的文件(唯一标识符)。

  2. 将块应用于重建(索引号)。

  3. 在浏览器中传输二进制数据时,似乎整个有效负载必须是二进制的。因此,我无法创建具有上述属性的JSON对象,并且具有带有实际二进制块的data属性。

    我想我需要将文件块包装到包含标识符和索引的辅助二进制blob中。然后,接收客户端将解码第一个包装器块以检查元数据,然后根据该信息处理实际文件块。

    如何在浏览器中执行此操作?我已经做了很多谷歌搜索,但似乎无法找到任何关于此的信息,所以想知道我是否可能忽略了一些可以帮助简化此过程的内容?

3 个答案:

答案 0 :(得分:5)

您必须创建自己的传输文件协议。

  1. 我假设您有Blob / Uint8Array个对象。您可能还使用split()方法来获取块。
  2. 您只需使用Uint8Array即可传输数据。

    1. 创建满足您需求的协议,例如:

      • 1字节:包类型(255种可能的包类型)
      • 2字节:数据长度(每块2 ^ 16字节~64KB数据)
      • n bytes:< Data>
    2. 发送初始包(例如类型0x01)

      • 数据包含一些信息(全部或部分):
        • blob / file的总长度
        • 文件类型
        • 块大小
        • 块数
        • 文件名
        • ...
    3. 发送数据块(例如,类型0x02)

      • 您应该至少使用两个字节作为序列号
      • 之后是数据(不需要长度,因为你知道总长度)
  3. 注意:如果要传输多个文件,则应添加ID或其他内容。

    在接收方,您可以等待初始包,然后创建一个长度为整个文件的新0-based-chunk-number。然后,您可以使用set()在块位置添加收到的数据(偏移= chunk-size * Blob)。收到所有块后,您可以创建lmplot

答案 1 :(得分:1)

除了@ Robert的非常好的答案,你可以使用channel.send(blob)(至少在Firefox< - > Firefox中)。最终这也适用于Chrome。

答案 2 :(得分:0)

如果只是多个文件的简单问题,您可以为每个新文件创建一个新的数据通道。

每个频道都会处理它自己的缓冲,序列等。

类似的东西:

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

然后按顺序将文件分成< 64k块和chan.send()

接收方可以获取标签并使用它来正确保存文件

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

P.S。 如果你真的必须在一个通道上使用文件系统协议(比如因为你想要随机访问行为),不要发明一个新的,使用一个已经存在并经过测试的 - 我喜欢9p来自inferno / plan9