Отправка изображений/файлов через Sockjs + Spring Websocket + Stomp

Я работаю над приложением для обмена сообщениями, используя веб-сокеты Spring (STOMP в качестве подпротокола) и Sockjs.

Я должен обеспечить поддержку для отправки файлов в сообщениях.

Согласно этой заявке, sockjs не поддерживает двоичные данные, а STOMP поддерживает.

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

У меня есть пара вопросов:

1) Есть ли обходной путь для отправки изображений/файлов через sockjs + stomp или преобразование в Base64 — единственный способ?

2) Может быть, это очень глупый вопрос, но согласно этот вопрос можно отправлять двоичные данные через STOMP (без sockjs). Насколько сложно поддерживать откат без sockjs?

Спасибо.

EDIT: Если использование base64 является единственным вариантом, я бы предпочел сделать запрос POST, чтобы сохранить сообщения с вложениями, вместо использования кодировки base64. Есть идеи, что лучше?


person Karthik    schedule 29.06.2015    source источник


Ответы (3)


Любая реализация Web Socket будет обрабатывать двоичные данные, если они закодированы в base64. По сути, это сериализует двоичный поток в строку. Все транспорты и оболочки сокетов могут обрабатывать строковые данные. Любая реализация Java base64 должна работать.

Со стороны браузера base64 изначально обрабатывается в современных браузерах с помощью btoa() и atob(). Если вы поддерживаете устаревшие браузеры, вам может понадобиться полифилл.

Тем не менее, если сервер Java просто проксирует сообщения между веб-пользователями, вам не нужно будет декодировать изображения в Java, вы просто передадите изображения, закодированные строкой, из одного соединения сокета в другое.

person Martin    schedule 24.07.2015
comment
простая реализация веб-сокета поддерживает двоичные данные, я знаю об этом. Но я специально пытаюсь выяснить, есть ли какой-нибудь хак/поворот для SockJS. - person Karthik; 24.07.2015
comment
Я знаю, что мы можем использовать кодировку base64, но я искал альтернативы, потому что это приложение имеет очень частые сообщения с вложениями. Таким образом, использование base64 излишне увеличивает размер. - person Karthik; 31.07.2015
comment
Но будет ли он передаваться или просто кодировать одно действие в строку перед отправкой. Другими словами, эффективно ли использовать WebSockets для этой цели? - person Marc; 26.06.2016

Другой альтернативой может быть использование WebRTC только для отправки бинарных изображений. Одним из преимуществ этого является то, что эти сообщения будут чисто одноранговыми. Вам нужно будет реализовать это только в своем веб-приложении, а не в вашем бэкэнде. Тогда вам не нужно будет платить за пропускную способность, используемую для изображений. К сожалению, WebRTC не поддерживается IE.

person Martin    schedule 31.07.2015
comment
это не решит проблему да? Мне нужно сохранить сообщения на сервере. Обмен сообщениями в автономном режиме с WebRTC будет невозможен. - person Karthik; 31.07.2015
comment
Ага. Я не знаю, почему вы хотите использовать веб-сокеты для отправки двоичных данных, если это не приложение реального времени. Было бы разумнее использовать составную загрузку, если вы ставите сообщения в очередь. - person Martin; 31.07.2015
comment
Пользователь может общаться с разными пользователями, которые находятся в сети через соединение с веб-сокетом. Если он хочет отправить сообщение автономному пользователю, я могу использовать то же соединение с веб-сокетом. Почему клиент должен беспокоиться о том, онлайн ли пользователь или нет? - person Karthik; 31.07.2015

Вы посмотрите бинарные файлы. это обещание бинарной потоковой передачи в реальном времени для Интернета с использованием веб-сокетов.

давайте проверим примеры

https://github.com/binaryjs/binaryjs/tree/master/examples

Вы должны проверить Atmosphere(wasync), ссылка подскажет, как реализовать.

насколько вы поняли сценарий резервного копирования вашего браузера на стороне клиента, вы можете использовать [base64 polyfill lib (https://github.com/davidchambers/Base64.js/).

Наилучшие пожелания

person daimon    schedule 30.07.2015
comment
Я думаю, вероятно, вы неправильно поняли мой вопрос, я не искал что-то, что поддерживает двоичный код, я ищу способ отправки двоичных данных через SockJS. - person Karthik; 30.07.2015
comment
Почему вы хотите передавать двоичные данные, особенно через SockJS, вы пытаетесь поддерживать старые браузеры или по другой причине? - person daimon; 30.07.2015
comment
Да, я не хочу реализовывать резервные варианты самостоятельно. - person Karthik; 31.07.2015
comment
Можете ли вы проверить Atmosphere? Я думаю, это может быть альтернативой sockjs. он также поддерживает резервные сценарии. - person daimon; 31.07.2015
comment
Да, это была моя первая вещь, которую я изучил, но я не мог настроить ее в соответствии со своими потребностями. Может быть, я не использовал его должным образом, но как-то я не чувствовал себя комфортно с ним. - person Karthik; 31.07.2015