Подтвердить что ты не робот

Socket.io: отправить сообщение в определенную комнату (на стороне клиента)

В socket.io вы обычно используете определенный синтаксис на стороне сервера, если хотите отправить сообщение в определенную комнату: io.to(room).emit('event', 'message');.

Но как клиент (что я имею в виду - это код, связанный с socket.io, запущенный в браузере), указывает, что сообщение должно идти в определенную комнату?

Обычно ли просто создавать что-то вроде этого (конечно, сервер должен его оценить):

socket.emit('chat message', {room: 'abc', msg: 'hello there'});

Или библиотека клиентской стороны socket.io также предлагает специальный синтаксис для этой цели?

edit: чтобы уточнить, мое предложение сверху, похоже, работает, я просто не уверен, есть ли лучшее решение.

4b9b3361

Ответ 1

Вы очень многое поняли. Только сервер может испускать определенные комнаты, потому что только сервер фактически подключен к нескольким клиентам. Другими словами, клиенты не связаны друг с другом - библиотека на стороне клиента управляет только сообщениями между этим клиентом и сервером. Итак, если вы хотите, чтобы ваше клиентское приложение дало указание серверу выпустить сообщение всем клиентам, подключенным к данной комнате... этот базовый дизайн API. Вы можете выпустить событие сокета или просто выполнить обычный HTTP-вызов маршрута на вашем сервере. В любом случае вы будете отправлять метаданные о том, в каких комнатах (ах) должен транслироваться сервер. Первый вариант (предпочтительнее), вероятно, предпочтительнее, потому что на стороне сервера вы можете использовать socket.broadcast.to, чтобы испускать всех клиентов в комнате. ИСКЛЮЧИТЕ сокет, инициировавший вызов (довольно распространенный вариант использования).

Ответ 2

Решение Alapeno предназначалось для того, чтобы клиент отправил конкретную комнату в качестве части данных сообщения на сервер, чтобы сервер знал, в какую комнату для трансляции сообщения.

Однако , если вы хотите, чтобы клиент отправил сообщение в свою комнату, вы можете обнаружить серверную комнату самостоятельно через объект socket.rooms. Таким образом, вам не нужно, чтобы клиент отправил имя своей комнаты как часть сообщения, как вы указали.

Client.js:

socket.emit('chat message', 'hello');

Server.js:

socket.on('chat message', function(msg){
    var keys = Object.keys(socket.rooms);
    for (var i = 0; i < keys.length; i++) {
        io.to(socket.rooms[keys[i]]).emit('chat message', msg);
    }
});

Обновление. Объект socket.rooms содержит вид хэша, такой как пример ниже, поэтому вам лучше отправить все комнаты в socket.rooms, чтобы убедиться, что члены комнаты его получают. Вы не можете гарантировать порядок ключей.

Пример:

socket.rooms[keys[0]]) = WMWlX-ekAxa8hP8FAAAE

socket.rooms[keys[1]]) = app-chat-room