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

Nic*_*ngs 0 javascript browser blob webrtc rtcdatachannel

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

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

  1. 数据块与哪个文件相关(唯一标识符).

  2. 块中适用于重建的位置(索引号).

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

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

我怎么能在浏览器中这样做?我已经做了很多谷歌搜索,但似乎无法找到任何关于此的信息,所以想知道我是否可能忽略了一些可以帮助缓解这个过程的东西?

Rob*_*ert 5

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

  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.