2015-05-25 3 views
21

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

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

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

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

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

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

+0

AFAIK использование помещений и пространства имен является рекомендация socket.io http://socket.io/docs/server-api/ HTTP: // socket.io/docs/rooms-and-namespaces/ – Pogrindis

+0

Они предлагают использовать 'multiplexing', http: // socket.io/docs/# restricting-yourself-to-a-namespace Хотя это пространство 'namespace' не' rooms', но это может помочь в аналогичном сценарии. – Ankit

+0

@Pogrindis Спасибо, я знаю об этом, и я использую концепцию комнат на стороне сервера. Боюсь, мой вопрос недостаточно ясен. Мне интересно, как приложение на стороне клиента (например, чат на основе angular.js с использованием socket.io) может сообщить серверу socket.io, в какую комнату должно идти сообщение. – alapeno

ответ

17

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

+0

Спасибо за подробный ответ, Габриэль. Так что я был не так. – alapeno

1

Решение 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); 
    } 
}); 

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

Пример:

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

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

Смежные вопросы