Peerjs: DataChannel закрывается неожиданно и без причины

Созданный на 1 апр. 2015  ·  5Комментарии  ·  Источник: peers/peerjs

У меня возникают некоторые проблемы с передачей файлов с помощью PeerJS ... передача идет нормально, а затем PeerJS просто закрывает DataChannel, и нет журнала о том, что пошло не так. Я включил отладку для PeerJS и запускаю PeerServer локально, чтобы получить журналы отладки.

PeerJS регистрирует в консоли Chrome:

screen shot 2015-03-31 at 8 35 25 pm

... передача идет нормально, а затем строка «DataChannel closed for: abc123_f9pes» регистрируется, соединение прерывается, и передача прекращается.

PeerServer регистрируется в терминале:

screen shot 2015-03-31 at 8 35 45 pm

... передача идет нормально, затем регистрируются 2 строки «Socket closed», после чего происходит смерть передачи.

Мой первый вопрос: почему строки «Добавлен кандидат ICE для» и «Полученные кандидаты ICE для» несколько раз регистрируются PeerJS, а строки «КАНДИДАТ от» - PeerServer?

Другой мой вопрос: почему разрывается соединение? Кажется, что сокет закрывается ... есть идеи, что может пойти не так?

Вот обзор моей среды:

  • PeerJS v0.3.13
  • PeerServer v0.2.8
  • Chrome v41
  • Mac OS X версии 10.10.2

ps эта проблема сохраняется даже при работе с облачным сервером PeerServer.

Самый полезный комментарий

@ 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).

Все 5 Комментарий

Оказывается, я слишком быстро читал файл, и буфер канала данных 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).

Была ли эта страница полезной?
0 / 5 - 0 рейтинги