Socket.io: отправить сообщение в определенную комнату (на стороне клиента)
В socket.io вы обычно используете определенный синтаксис на стороне сервера, если хотите отправить сообщение в определенную комнату: io.to(room).emit('event', 'message');
.
Но как клиент (что я имею в виду - это код, связанный с socket.io, запущенный в браузере), указывает, что сообщение должно идти в определенную комнату?
Обычно ли просто создавать что-то вроде этого (конечно, сервер должен его оценить):
socket.emit('chat message', {room: 'abc', msg: 'hello there'});
Или библиотека клиентской стороны socket.io также предлагает специальный синтаксис для этой цели?
edit: чтобы уточнить, мое предложение сверху, похоже, работает, я просто не уверен, есть ли лучшее решение.
Ответы
Ответ 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