socket.io - как транслировать сообщения в пространстве имен? - PullRequest
47 голосов
/ 25 июня 2011

В соответствии с примерами socket.io:

Чтобы транслировать, просто добавьте флаг broadcast к вызовам методов emit и send.Вещание означает отправку сообщения всем остальным, кроме сокета, который его запускает.

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.broadcast.emit('user connected');
});

Я попытался объединить это с новой функцией socket.io namsepace, поэтому получил следующее:

var chat = ioserver.of('/chat');

chat.on('connection', function (socket) {
      console.log('chat connection');   
      socket.on('message', function (msg) {
        console.log(msg);  
        chat.send(msg);
      });
  });

Это работает нормально, все участники канала чата (и других каналов не получают) получают сообщение.Но отправитель тоже получает это.Поэтому я попытался сделать следующее:

chat.on('connection', function (socket) {
      console.log('chat connection');   
      socket.on('message', function (msg) {
        console.log(msg);  
        chat.broadcast.send(msg);
      });
  });

и получил исключение: «Невозможно вызвать метод« отправить »из неопределенного».Итак, я подумал, что широковещательная передача - это особенность одного сокета (хотя это немного странно - как один сокет может распространяться на все остальные ...).Поэтому я попытался:

chat.on('connection', function (socket) {
      console.log('chat connection');   
      socket.on('message', function (msg) {
        console.log(msg);  
        socket.broadcast.send(msg);
      });
  });

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

Если я сделаю:

chat.on('connection', function (socket) {
      console.log('chat connection');   
      socket.on('message', function (msg) {
        console.log(msg);  
        socket.send(msg);
      });
  });

, тогда только исходный отправитель получит сообщение, и это опять-таки довольно логично - яиспользовал 'send' клиентского сокета.

Итак, вопрос в том, как правильно использовать функцию вещания?

Может быть, разработчикsocket.io допустил ошибку и добавил функцию широковещания к неправильному объекту (как я понимаю, это должна быть функция пространства имен, но теперь она определена только для сокета)?

Ответы [ 4 ]

70 голосов
/ 16 июля 2011

Кажется, я смог решить это для себя после открытия щедрости.Извините за это.

В любом случае, посмотрите, поможет ли это:

chat.on('connection', function (socket) {
  socket.on('message', function (msg) {
    socket.emit(msg); // Send message to sender
    socket.broadcast.emit(msg); // Send message to everyone BUT sender
  });
});

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

35 голосов
/ 22 января 2012

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

Вы можете сделать этоиспользуя io.sockets.emit:

var io = require('socket.io').listen(80);
io.sockets.emit('message', { message: "Hello everyone!" });

Однако в документации не ясно, как это сделать для определенного пространства имен.io.sockets - это просто сокращение до io.of(''), поэтому вы можете транслировать его всем в пространстве имен, позвонив по номеру io.of('/namespace').emit:

var io = require('socket.io').listen(80);
io.of('/admins').emit('message', { message: "Hello admins!" });
28 голосов
/ 28 июня 2014
var customNS = ioserver.of('/chat'); 

customNS.on('connection', function (socket) {
   socket.on('message', function (msg) {

       // Send message to sender 
       socket.emit(msg);

       // Send message to everyone on customNS INCLUDING sender
       customNS.emit(msg);

       // Send message to everyone on customNS BUT sender
       socket.broadcast.emit(msg);

       // Send message to everyone on ROOM chanel of customNS INCLUDING sender
       customNS.in('ROOM').emit(msg); 

       // Send message to everyone on ROOM chanel of customNS BUT sender
       socket.broadcast.in('ROOM').emit(msg); 


   });
});

также проверьте этот ответ Отправьте ответ всем клиентам, кроме отправителя (Socket.io)

14 голосов
/ 10 апреля 2013

Может быть, это кому-нибудь поможет

socket.broadcast.to('room1').emit('updatechat', 'SERVER', username + ' has connected to this room'); 

см.

Учебник по мультирум Nodejs и Socketio

...