Max*_*ari 14 javascript file-sharing chunks webrtc peerjs
我正在使用PeerJS,但认为这个问题WebRTC一般都可以,希望你能帮助我:
我正在尝试编写一个简单的点对点文件共享.我使用serialisation: "none"的PeerJS连接DataChannel,因为我只发送纯ArrayBuffers.
对于10mb左右的文件,一切都很好但是我在发送更大的文件(30+ mb)时遇到问题,例如在发送10-20个第一块900mb zip文件连接之后,在同行之间开始投掷Connection is not open. You should listen for the "open" event before sending messages.(Sender旁边)
我的设置:
文件被拖动拖放,Sender用于FileReader以ArrayBuffer64x1024字节(与16x1024没有区别)的块读取它,并且一读取每个块 - 它通过peer.send(ChunkArrayBuffer)发送.
Recieverblob从每个接收到的块创建,在传输完成后创建完整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缓冲区或溢出某种缓冲区的同时操作的某种限制?
Update1:这是我的PeerJS连接对象,DataChannel里面有对象:

大家好消息!
这是一个缓冲区溢出DataChannel问题,这篇文章http://viblast.com/blog/2015/2/25/webrtc-bufferedamount/
bufferedAmount是DataChannel(DC)对象的属性,在最新Chrome版本中显示当前在缓冲区中的数据量,当超过16MB时 -  DC静默关闭.因此,任何遇到此问题的人都需要在应用程序级别实现缓冲机制,这将监视此属性并在需要时保留消息.此外,请注意,在
同一属性Chrome之前的版本中37显示消息的数量(不是大小),更多的是它在Windows下被破坏并显示0,但溢出时v <37 DC未关闭 - 仅抛出异常,其中也可以捕获以指示缓冲区溢出.
我peer.js为自己做了一个未编辑的代码编辑,在这里你可以在一个函数中看到这两个方法(更多的源代码你可以看看https://github.com/peers/peerjs/blob/master/dist/peer. js#L217)
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;
 }        
}
还在PeerJSGitHub上打开了一个问题:https://github.com/peers/peerjs/issues/291