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