Я использую PeerJS
, но думал, что эта проблема может быть примерно WebRTC
в общем, надеюсь, что вы можете мне помочь:
Я пытаюсь написать простой обмен файлами одноранговой сети. Я использую serialisation: "none"
для PeerJS
соединения DataChannel
, так как я отправляю только чистый ArrayBuffers
.
Все хорошо с файлами около 10 Мб, но у меня проблемы с отправкой большего файла (30+ мб), например, после отправки aroung 10-20 первых фрагментов соединения с файлом в размере 900 мб между пэрами начинают метать Connection is not open. You should listen for the "open" event before sending messages
. (со стороны Sender
)
Моя настройка:
Файл, перетаскиваемый, чтобы перетащить & drop, Sender
использует FileReader
, чтобы читать его как ArrayBuffer
в кусках размером 64x1024 байта (без разницы с 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();
}
Любые идеи, что может вызвать это?
Обновление: установка 50 мс. Тайм-аут между передачами каналов помог немного, загрузка файла 900mb достигла 6% (вместо 1 - 2% ранее), прежде чем начинать бросать ошибки. Может быть, это какой-то предел одновременных операций через DataChannel
или переполнение какого-то буфера DataChannel
?
Update1: Здесь мой объект соединения PeerJS
с объектом DataChannel
внутри него: