socket.io - как транслировать сообщения в пространстве имён?

Согласно примерам 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);
      });
  });

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

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 допустил ошибку и добавил функцию широковещания не к тому объекту (насколько я понимаю, это должно быть функцией пространства имен, но теперь она определена только для сокета)?

48
задан JustAMartin 25 June 2011 в 01:39
поделиться