Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 快速块传输时PeerJS/WebRTC连接失败_Javascript_Webrtc_File Sharing_Chunks_Peerjs - Fatal编程技术网

Javascript 快速块传输时PeerJS/WebRTC连接失败

Javascript 快速块传输时PeerJS/WebRTC连接失败,javascript,webrtc,file-sharing,chunks,peerjs,Javascript,Webrtc,File Sharing,Chunks,Peerjs,我使用的是PeerJS,但我认为这个问题可能与WebRTC有关,希望您能帮助我: 我正在尝试编写一个简单的点对点文件共享。我正在使用序列化:“none”用于PeerJS连接DataChannel,因为我只发送纯arraybuffer 对于10mb左右的文件,一切都很好,但我在发送更大的文件(30+mb)时遇到问题,例如,在发送大约10-20个900mb zip文件块后,对等方之间的连接开始抛出连接未打开。在发送消息之前,您应该先侦听“打开”事件。(在发送方侧) 我的设置: 拖放文件时,Sende

我使用的是
PeerJS
,但我认为这个问题可能与
WebRTC
有关,希望您能帮助我:

我正在尝试编写一个简单的点对点文件共享。我正在使用
序列化:“none”
用于
PeerJS
连接
DataChannel
,因为我只发送纯
arraybuffer

对于10mb左右的文件,一切都很好,但我在发送更大的文件(30+mb)时遇到问题,例如,在发送大约10-20个900mb zip文件块后,对等方之间的连接开始抛出
连接未打开。在发送消息之前,您应该先侦听“打开”事件
。(在
发送方
侧)

我的设置:

拖放文件时,
Sender
使用
FileReader
以64x1024字节的块(与16x1024没有区别)将其读取为
ArrayBuffer
,并在读取每个块后通过peer.send(ChunkArrayBuffer)发送

receiver
从每个接收到的区块创建
blob
,传输完成后,从这些区块中创建一个完整的
blob
,并向用户提供链接

我的对等连接设置:

   var con = peer.connect(peerid, {
        label: "file",
        reliable: true,
       serialization: "none"
   })
我的发送功能:

function sliceandsend(file, sendfunction) {
    var fileSize = file.size;
    var name = file.name;
    var mime = file.type;
    var chunkSize = 64 * 1024; // bytes
    var offset = 0;

 function readchunk() {
    var r = new FileReader();
    var blob = file.slice(offset, chunkSize + offset);
    r.onload = function(evt) {
        if (!evt.target.error) {
            offset += chunkSize;
            console.log("sending: " + (offset / fileSize) * 100 + "%");
            if (offset >= fileSize) {
                con.send(evt.target.result); ///final chunk
                console.log("Done reading file " + name + " " + mime);
                return;
            }
            else {                    
                con.send(evt.target.result);
            }               
        } else {
            console.log("Read error: " + evt.target.error);
            return; 
        }
        readchunk();
       };
        r.readAsArrayBuffer(blob);
    }
    readchunk();
  }
你知道这是什么原因吗

更新:在数据块传输之间设置50ms超时有点帮助,900mb文件加载在开始抛出错误之前达到了6%(而不是以前的1-2%)。可能是通过
datachannel
或溢出某种
datachannel
缓冲区的同时操作的某种限制?
更新1:这是我的
PeerJS
连接对象,其中包含
DataChannel
对象:

各位好消息
这是一个缓冲区溢出的
DataChannel
问题,这是本文的重点

bufferedAmount
DataChannel
DC
)对象的一个属性,在最新的
Chrome
版本中,当数据量超过16MB时,该对象以字节为单位显示当前在缓冲区中的数据量-DC被静默关闭。 因此,任何遇到此问题的人都需要在应用程序级别实现缓冲机制,该机制将监视此属性并在需要时保留消息。另外,请注意,在
Chrome
之前的
37

相同的属性显示消息的数量(而不是大小),更多的属性在windows下被破坏并显示为0,但在vI中,在某些情况下出现了相同的问题,但不再存在。我的代码在上,但是用dart编写的。也许有帮助!我将
{'ordered':true,'reliable':true}
添加到
createDataChannel
中,这可能有帮助吗?@Robert遗憾的是,这没有帮助,
peerjs
conenction对象中的
DataChannel
对象中的'ordered'和'reliable'已经是真的。现在我将把我的conenction对象添加到问题中,你们能把你们的扔到这里吗?这样我就可以比较两者了?这里有一个指向我的github代码的链接。我没有使用peerjs,因此我无法真正帮助您:(对我来说,FileReader需要25-50毫秒才能将blob转换为bytearray,这似乎足以让它对我起作用。@Robert我指的是在运行时创建的连接对象,而您正在连接到另一个对等方,也就是您用来发送消息的对等方。当然,如果您现在可以轻松访问它。请将localhost设置为运行诚实地说,您查看一个对象的代码有点胡闹。数据通道看起来完全相同。
DataConnection.prototype._trySend = function(msg) {
var self = this;
function buffering() {
    self._buffering = true;
    setTimeout(function() {
        // Try again.
        self._buffering = false;
        self._tryBuffer();
    }, 100);
    return false;
}
if (self._dc.bufferedAmount > 15728640) {
    return buffering(); ///custom buffering if > 15MB is buffered in DC 
} else {
    try {
        this._dc.send(msg);
    } catch (e) {
        return buffering(); ///custom buffering if DC exception caught
    }
    return true;
 }        
}