我正在使用PeerJS
,但认为这个问题可能是WebRTC
一般的,希望你能帮助我:
我正在尝试编写一个简单的点对点文件共享。我正在使用serialisation: "none"
for PeerJS
connection DataChannel
,因为我只是发送 pure 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
以 64x1024 字节块的形式读取它ArrayBuffer
(与 16x1024 没有区别),并且在读取每个块后 - 它通过 peer.send(ChunkArrayBuffer) 发送。
Reciever
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
缓冲区的同时操作的某种限制?
Update1:这是我的PeerJS
连接对象,DataChannel
里面有对象: