У меня возникают некоторые проблемы с передачей файлов с помощью PeerJS ... передача идет нормально, а затем PeerJS просто закрывает DataChannel, и нет журнала о том, что пошло не так. Я включил отладку для PeerJS и запускаю PeerServer локально, чтобы получить журналы отладки.
PeerJS регистрирует в консоли Chrome:
... передача идет нормально, а затем строка «DataChannel closed for: abc123_f9pes» регистрируется, соединение прерывается, и передача прекращается.
PeerServer регистрируется в терминале:
... передача идет нормально, затем регистрируются 2 строки «Socket closed», после чего происходит смерть передачи.
Мой первый вопрос: почему строки «Добавлен кандидат ICE для» и «Полученные кандидаты ICE для» несколько раз регистрируются PeerJS, а строки «КАНДИДАТ от» - PeerServer?
Другой мой вопрос: почему разрывается соединение? Кажется, что сокет закрывается ... есть идеи, что может пойти не так?
Вот обзор моей среды:
ps эта проблема сохраняется даже при работе с облачным сервером PeerServer.
Оказывается, я слишком быстро читал файл, и буфер канала данных WebRTC заполнился, он имеет ограничение в 16 мегабайт:
http://viblast.com/blog/2015/2/25/webrtc-bufferedamount/
Если много сообщений отправляется вместе, они не могут быть переданы все сразу. Они помещаются во входной буфер. Но буфер не может расти бесконечно; обычно у него есть заранее определенный предел. Если лимит превышен, то в Chrome> = 37 канал данных закрывается, все сообщения отбрасываются и генерируется исключение. Однако в Chrome <= 36 выдается только исключение. Итак, это принципиальное изменение API, внесенное в Chrome 37. Разработчикам следует быть осторожными с этим изменением, если они имеют дело со старыми браузерами.
Боже мой ... Я столкнулся с той же проблемой, с peerJS, и я не смог найти никакого ответа (у меня было предположение, что это какая-то вещь, связанная с буфером), наконец, спасибо за идею, я надеюсь, что это будет решить мою проблему. Интересно, что у peerJS есть внутренний механизм буферизации, который, как я понимаю, был сделан правильно для этой проблемы, ОДНАКО его реализация, похоже, полагается на перехват исключения из-за невозможности отправки, и если в новом chrome chunnel просто убивается, это система теперь избыточна. Я поставлю здесь вопрос по этому поводу, как только (если) буду уверен, что это причина.
Изменить: да, выглядит законным, bufferedAmount составляет около 16 МБ, и все терпит неудачу.
Да, это была болезненная ошибка, которую нужно было обнаружить. Мне потребовались дни, чтобы наконец понять, что происходит. PeerJS необходимо обновить, чтобы правильно обрабатывать переполнение буфера канала данных и Chrome прерывает соединение.
Кстати, если кто-то наткнется на это, я открыл проблему и опубликовал крошечную правку в источнике peer.js, чтобы исправить это https://github.com/peers/peerjs/issues/291
@ UnsungHero97
Если много сообщений отправляется вместе, они не могут быть переданы все сразу. Они помещаются во входной буфер. Но буфер не может расти бесконечно; обычно у него есть заранее определенный предел. Если лимит превышен, то в Chrome> = 37 канал данных закрывается, все сообщения отбрасываются и генерируется исключение. Однако в Chrome <= 36 выдается только исключение. Итак, это принципиальное изменение API, внесенное в Chrome 37. Разработчикам следует быть осторожными с этим изменением, если они имеют дело со старыми браузерами.
Небольшое исправление: 16 КБ, а не 16 МБ, для использования в будущем. Я столкнулся с той же проблемой. Ограничение Firefox составляет примерно 16 килобайт (https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Using_data_channels#Understanding_message_size_limits).
Самый полезный комментарий
@ UnsungHero97
Небольшое исправление: 16 КБ, а не 16 МБ, для использования в будущем. Я столкнулся с той же проблемой. Ограничение Firefox составляет примерно 16 килобайт (https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Using_data_channels#Understanding_message_size_limits).