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;
}
}