繁体   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