我正在使用PeerJS
,但认为这个问题可能与WebRTC
有关,希望您能帮助我解决:
我正在尝试编写一个简单的点对点文件共享程序。我在PeerJS
连接DataChannel
中使用serialisation: "none"
,因为我只发送纯的ArrayBuffers
。
一切都很好,对于大约10MB左右的文件,但是发送更大的文件(30MB以上)时出现问题,例如,在发送大约10-20个900MB zip文件块后,对等方之间的连接开始抛出Connection is not open. You should listen for the "open" event before sending messages
。(在Sender
端)
我的设置:
将文件拖到拖放区域,Sender
使用FileReader
以64×1024字节的块读取它作为ArrayBuffer
(使用16×1024没有区别),并在每个块读取完毕后立即通过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();
}
有什么想法可以导致这种情况发生吗?更新:在分块传输之间设置50毫秒的超时有所帮助,900mb的文件加载在开始抛出错误之前达到了6%(之前只有1-2%)。也许这是通过数据通道进行的同时操作的某种限制或溢出某种数据通道缓冲区的问题?
更新1:这是我的PeerJS连接对象,里面包含DataChannel对象:
![Object visualization in Google Chrome](https://istack.dev59.com/6SFd9.webp)
createDataChannel
中添加了{'ordered': true, 'reliable': true}
,也许会有所帮助? - RobertDataChannel
对象中的“ordered”和“reliable”已经是true了,而且它们在我的peerjs
连接对象中。我现在会将我的连接对象添加到问题中,你能否把你的连接对象也放在这里,这样我就可以比较一下两个对象? - Max Yari