为二进制块创建元数据,以通过WEBRTC Datachannel发送



我在两个浏览器之间具有datachannel连接,并希望将一个文件分解成块并将其发送给/从客户端发送。

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

的方法
  1. 哪个文件块与(唯一标识符)有关。

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

在浏览器中传输二进制数据时,似乎整个有效载荷必须是二进制的。因此,例如,我不能使用上述属性创建一个JSON对象,并且具有带有实际二进制块的data属性。

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

我该如何在浏览器中执行此操作?我已经进行了很多Google搜索,但似乎找不到有关此信息的任何信息,所以想知道我是否可能忽略了可以帮助缓解此过程的东西?

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

  1. 我假设您有一个File/Blob对象。您可能还使用split()方法来获取块。
  2. 您可以简单地使用uint8array传输数据。

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

      • 1个字节:软件包类型(255个可能的软件包类型)
      • 2个字节:数据长度(2^16字节〜64kb的数据)
      • n字节:< data>
    2. 发送初始软件包(例如类型0x01)

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

      • 您应该将至少两个字节用于序列号
      • 随后遵循数据(由于您知道总长度而不需要长度)

注意:如果传输多个文件,则应添加一个ID或其他内容。

在接收方侧面,您可以等待初始软件包,并创建一个具有总文件长度的新Uint8Array。之后,您可以使用set()在块位置添加接收到的数据(OFFSET = 0-based-chunk-number * chunk-size)。收到所有块时,您可以创建Blob

除了 @Robert的好答案外,您还可以使用channel.send.send.send(blob)(至少在Firefox< -> Firefox中)。最终,这也应该在Chrome中起作用。

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

每个通道都会照顾自己的缓冲,序列等。

类似:

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

然后将您的文件分解为< 64k块,然后按顺序进行chan.send()

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

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

等。

P.S。如果您确实必须通过单个通道使用文件系统协议(例如,因为您想要随机访问行为)不要发明新通道,请使用已经存在并经过测试的通道 - 我喜欢Inferno/plan9

最新更新