Ответ 1
Почему бы просто не сделать так, как показано ниже?
io.sockets.emit('hello',{msg:'abc'});
Я создаю простую систему, такую как лента новостей в реальном времени, используя node.js + socket.io.
Поскольку это система "только для чтения", клиенты подключаются и получают данные, но клиенты фактически не отправляют какие-либо данные самостоятельно. Сервер генерирует сообщения, которые должны быть отправлены всем клиентам, ни один клиент не генерирует никаких сообщений; но мне нужно транслировать.
Документация для рассылки socket.io (конец страницы) говорит
Для трансляции просто добавьте флаг
broadcast
в вызовы методовemit
иsend
. Вещание означает отправку сообщения всем остальным, кроме сокета, который его запускает.
Таким образом, я в настоящее время захватываю последнего клиента для подключения, в переменную, затем emit()
к этому сокету и broadcast.emit()
к этому сокету, так что этот новый клиент получает новые данные и все остальные клиенты. Но похоже, что роль клиента здесь не что иное, как обходное решение для того, что, как я думал, уже поддерживается socket.io.
Есть ли способ отправить данные всем клиентам на основе события, инициированного сервером?
Мой текущий подход примерно:
var socket;
io.sockets.on("connection", function (s) {
socket = s;
});
/* bunch of real logic, yadda yadda ... */
myServerSideNewsFeed.onNewEntry(function (msg) {
socket.emit("msg", { "msg" : msg });
socket.broadcast.emit("msg", { "msg" : msg });
});
В основном события, которые заставляют данные запрашивать отправку на клиент, являются серверными, а не клиентскими.
Почему бы просто не сделать так, как показано ниже?
io.sockets.emit('hello',{msg:'abc'});
Поскольку вы излучаете события только на стороне сервера, вы должны создать для своего сервера EventEmitter.
var io = require('socket.io').listen(80);
events = require('events'),
serverEmitter = new events.EventEmitter();
io.sockets.on('connection', function (socket) {
// here you handle what happens on the 'newFeed' event
// which will be triggered by the server later on
serverEmitter.on('newFeed', function (data) {
// this message will be sent to all connected users
socket.emit(data);
});
});
// sometime in the future the server will emit one or more newFeed events
serverEmitter.emit('newFeed', data);
Примечание. newFeed
- это просто пример события, вы можете иметь столько событий, сколько захотите.
Внимание!
Вышеприведенное решение лучше также потому, что в будущем вам может понадобиться излучать определенные сообщения только некоторым клиентам, а не всем (при этом нужны условия). Для чего-то более простого (просто выпустите сообщение всем клиентам, независимо от того, что), io.sockets.broadcast.emit()
действительно лучше подходит.