Мультиплексирование каналов в веб-сокете

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

Я хочу разработать сервер на java. Сервер узла для socketio имел странную ошибку с пространствами имен, а сервер Java для него неправильно работал с пространствами имен.

Мне нужна простая система мультиплексирования, чтобы я мог одновременно отправлять json и двоичные файлы. Есть ли что-то для этого или мне нужно создать что-то самому, если да... с чего начать?


person B3NW    schedule 20.07.2015    source источник
comment
Просмотрев реестр расширений, мы не обнаружили ни одного зарегистрированного расширения для каналов подключения. В данный момент.   -  person Myst    schedule 21.07.2015
comment
О, похоже, это черновик @Myst   -  person B3NW    schedule 21.07.2015


Ответы (2)


Я хочу отметить одну вещь: Мультиплексирование не поддерживает несколько форматов сообщений, поскольку webSocket не указывает формат тела, поэтому он похож на HTTP, вы можете отправлять JSON, изображение, двоичный файл.. . все, что вы хотите.

Мультиплексирование — это повторное использование одного канала соединения для поддержки нескольких соединений (аналогичная концепция в телекоммуникациях). Обычно это используется в сценариях, когда нескольким модулям требуется соединение через веб-сокет, но разрешено только одно соединение ( как SocketJS), тогда мы можем использовать технологию мультиплексирования, чтобы спасти мир.

Дополнительную информацию см. на странице https://github.com/sockjs/websocket-multiplex https://www.rabbitmq.com/blog/2012/02/23/how-to-compose-apps-using-websockets/

person Frank Zhang    schedule 08.11.2016

Существуют готовые библиотеки Javascript для клиентской стороны, включая эту: WebSocketFileTransfer.

Что касается решений на стороне сервера, я меньше в курсе. Я бы, вероятно, выбрал два соединения через веб-сокет или разделил файл на более мелкие сообщения веб-сокета с использованием javascript HTML5 - это позволило бы псевдомультиплексировать благодаря тому факту, что можно отправлять разные сообщения веб-сокета между фрагментами файла.

Я предпочитаю Ruby и, вероятно, напишу свое приложение (или, по крайней мере, серверную часть веб-сокета), используя Plezi framework. ... но я не уверен, что упомянутая вами проблема с пространством имен по-прежнему будет беспокоить вас, если вы решите псевдомультиплексировать, разделив файл на куски.

ИЗМЕНИТЬ

Я просто подумал, что, если вы не разделите отправленный файл на более мелкие фрагменты, которые позже будут собраны, будет очень сложно дать отзыв о процессе загрузки ...

Ваш веб-сервер (если вы не пишете свой собственный) не будет сообщать вам о входящих данных до тех пор, пока передача файла не будет завершена, поэтому вы не можете обновить клиент о том, сколько было получено. Кроме того, разделение файла может позволить вам повторно инициировать загрузку, если соединение прервано.

Думая об этом, я бы выбрал одно соединение и разделил каждый файл на несколько фрагментов (возможно, фрагмент на каждые 100 КБ или около того, в зависимости от вашего сервера и предполагаемого использования).

person Myst    schedule 21.07.2015
comment
У меня возникает соблазн просто использовать несколько соединений через веб-сокеты, одно из которых постоянно подключено, предоставляя сообщения json для управления, а управляющее соединение может отправлять номер порта для динамического подключения и загрузки файлов. Масштабирование не должно быть проблемой, я не планирую иметь много соединений в одном экземпляре. - person B3NW; 21.07.2015
comment
@ B3NW Я отредактировал свой ответ, подумав об ограничениях, которые могут возникнуть, если вы отправите файл как одно сообщение через веб-сокет. - person Myst; 21.07.2015
comment
Спасибо @Myst. Да, я понял, что мне нужно это сделать. Сигнализация чувствительна к задержке, поскольку она будет использоваться для управления потоком webrtc, поэтому, если нет какого-либо хорошего способа мультиплексировать каналы без добавления большой задержки, я просто буду использовать отдельные соединения. Тем не менее спасибо за помощь! - person B3NW; 22.07.2015