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"
})
Run Code Online (Sandbox Code Playgroud)
我的发送功能:
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();
}
Run Code Online (Sandbox Code Playgroud)
有什么想法可以导致这个?
更新:设置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;
}
}
Run Code Online (Sandbox Code Playgroud)
还在PeerJSGitHub上打开了一个问题:https://github.com/peers/peerjs/issues/291