@kirill-93

Как правильно работать с вебсокетами и разными типами данных?

Допустим, У меня есть чат. Я пересылаю сообщения через сокеты.
На клиенте это выглядит так:
const ws = new WebSocket('ws://localhost:3001');

            ws.onopen = () => {
                online = true;
            };

            ws.onclose = () => {
                online = false;
            };

            ws.send(SOMEDATA);

            ws.onmessage = res => {
            //Получаю разные данные в одном месте
            }

Вот тут SOMEDATA - это какая-то информация, которая уходит на сервер. Но эта информация уходит в одно и то же место. То есть в случае с AJAX, я указываю разные адреса для каждого запроса, а тут я подключаюсь один раз и шлю именно в это соединение все данные. То же самое с получением данных. Я получаю все данные в одном месте.
Мне, например, надо помимо сообщений, получать информацию о количество подключенных пользователей и еще разную информацию.
Для этого в голову приходит следующее: для всех пересылаемых сообщений определить специальный формат:
{
    type: 'Message',//totalUsers
    data: SOMEDATA
}

И передавать все сообщения в виде JSON. То есть любое сообщение будет содержать поле type и сами данные в поле data. Таким образом в обработчиках и на клиенте и на сервере, я смогу в зависимости от типа сообщения, делать разные действия.
Кстати, socket.io работает не по такому же принципу с его emit и on?
  • Вопрос задан
  • 98 просмотров
Пригласить эксперта
Ответы на вопрос 1
Xuxicheta
@Xuxicheta
инженер
ну как бы да, так и есть. Вы передаете через websocket текстовую строку или блоб, а что будет в нем решаете сами. Можно JSON-RPC сделать или еще какой формат, можно что-то свое как у вас указано, как угодно.
emit и on это методы для работы с событиями, взяты из ноды.
Для websocket я обычно использую свою обертку, которая тоже реализует событийный интерфейс.
А браузерный WebSocket наследуется от EventTarget, который имеет методы addEventListener и dispatchEvent, которые почти синонимы к on и emit.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы