Я использую PeerJS
, но думал, что эта проблема может быть связана с WebRTC
в целом, надеюсь, вы можете мне помочь:
Я пытаюсь написать простой одноранговый файлообменник. Я использую serialisation: "none"
для PeerJS
соединения DataChannel
, так как отправляю только чистые ArrayBuffers
.
Все хорошо с файлами размером около 10 МБ, но у меня проблемы с отправкой файлов большего размера (30+ МБ), например, после отправки около 10-20 первые куски соединения zip-файла размером 900 МБ между узлами начинают выдавать Connection is not open. You should listen for the "open" event before sending messages
. (со стороны Sender
)
Моя установка:
Файл перетаскивается для перетаскивания, 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 мс между передачами фрагментов немного помогла, загрузка файла размером 900 МБ достигла 6 % (вместо 1–2 % ранее), после чего начались ошибки. Может быть, это какой-то предел одновременных операций через datachannel
или переполнение какого-то datachannel
буфера?
Обновление1: Вот мой объект подключения PeerJS
с объектом DataChannel
внутри него:
{'ordered': true, 'reliable': true}
кcreateDataChannel
, может быть, это поможет? - person Robert   schedule 28.05.2015DataChannel
внутри моего объекта соединенияpeerjs
. Сейчас я добавлю свой объект соединения к вопросу, можете ли вы бросить сюда свой, чтобы я мог сравнить два? - person Max Yari   schedule 28.05.2015