В соответствии с примерами 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);
});
});
и получил исключение: "Невозможно вызвать метод" Отправить "из undefined. ' Хорошо, поэтому я подумал, что широковещательная передача - это функция одного сокета (он чувствует себя немного странно - как один сокет может brodacast для всех других...). Поэтому я попробовал:
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);
});
});
тогда только исходный отправитель получает сообщение, и это снова довольно логично - я использовал "отправку" связанного с клиентом сокета.
Итак, вопрос: какой правильный способ использовать функцию широковещания?
Возможно, разработчик socket.io сделал ошибку и добавил функцию широковещания к неправильному объекту (как я понимаю, это должна быть функция пространства имен, но теперь она определена только для сокета)?