我目前正致力于一个需要能够通过WebRTC数据通道发送文件的电子应用程序。我目前正在使用PeerJS作为一种方法来抽象WebRTC并使开发更容易。
我当前的实现使用发送方的FileReader来读取32千字节二进制块的文件。然后将这些块放入ArrayBuffer中,然后将其与一些数据一起发送,以告诉另一方发送者发送的确切内容。接收器然后将二进制数据写入文件。当接收器正在写入该数据时,发送器等待来自接收器的“文件继续”信号。当接收者完成后,发送者得到通知并发送下一个块。这一直持续到整个文件发送完毕。
这种方法有效,直到在应用程序运行时发送的所有文件都达到大约500兆字节。这是我认为由于内存泄漏而无法找到根本原因。据我所知,我没有将对象保存在内存中,应该由GC清除它们。另一个相当不寻常的事情是只有文件的收件人会遇到这个问题。
我的应用程序中发生了很多事情,但这是我认为是导致问题的部分。 (但随意请求更多代码)。
这是应该编写ArrayBuffer的部分:
sm.writeChunk = function(arrayBuffer) {
sm.receivedBytes += sm.receivedFileMeta.chunkSize;
fs.appendFileSync(sm.downloadsFolder + path.sep + sm.receivedFileMeta.name + '.part' , new Buffer(arrayBuffer , 'binary'), 'binary', function (err) {
if (err) {
console.log(err);
}
});
sm.onAction({t:'file-progress', percent: sm.receivedBytes / sm.receivedFileMeta.size * 100});
sm.dataConnection.send({t: 'file-proceed'});
};
sm是一个对象,它保存与文件传输相关的函数和变量,因此到处都是“sm。”。
我已经尝试将ArrayBuffer设置为undefined或null但似乎没有任何东西使对象从内存中消失。文件传输完成后甚至都没有。来自堆的快照似乎支持这一点。同时删除fs.appendFileSync函数使其不能写入磁盘没有任何区别。
我能解决这个问题吗?或者这是与PeerJS有关的问题?非常感谢任何帮助或建议!
答案 0 :(得分:0)
毕竟它似乎是一个PeerJS错误。看来如果你想发送大于16K的数据包,PeerJS会为你打包它们。内存问题在于分块。 PeerJS在16K时块,而电子(实际上是铬)可以一次发送64K。这是为了保持跨浏览器的兼容性,但由于我严格使用电子,我改变了PeerJS代码,以便不对我的32K数据包进行分块。这解决了这个问题。