¿node.js + socket.io se difunde desde el servidor, en lugar de desde un cliente específico?

Estoy construyendo un sistema simple como una fuente de noticias en tiempo real, usando node.js + socket.io.

Dado que este es un sistema de “solo lectura”, los clientes se conectan y reciben datos, pero los clientes nunca envían datos propios. El servidor genera los mensajes que deben enviarse a todos los clientes, ningún cliente genera ningún mensaje; sin embargo, necesito transmitir.

La documentación para la transmisión de socket.io (final de página) dice

Para transmitir, simplemente agregue una bandera de broadcast para emit y send llamadas de método. Transmitir significa enviar un mensaje a todos los demás, excepto el zócalo que lo inicia.

Así que actualmente capturo el cliente más reciente para conectar, en una variable, luego emit() a ese socket y broadcast.emit() a ese socket, de modo que este nuevo cliente obtenga los nuevos datos y todos los demás clientes. Pero parece que el rol del cliente aquí no es más que una solución para lo que pensé que socket.io ya era compatible.

¿Hay una manera de enviar datos a todos los clientes en función de un evento iniciado por el servidor ?

Mi enfoque actual es aproximadamente:

 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 }); }); 

Básicamente, los eventos que hacen que los datos requieran el envío al cliente son todos del lado del servidor, no del lado del cliente.

¿Por qué no simplemente hacer como abajo?

 io.sockets.emit('hello',{msg:'abc'}); 

Dado que solo está emitiendo eventos del lado del servidor, debe crear un EventEmitter personalizado para su servidor.

 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); 

Nota: newFeed es solo un ejemplo de evento, puede tener tantos eventos como desee.

Importante

La solución anterior es mejor también porque en el futuro es posible que necesite emitir ciertos mensajes solo para algunos clientes, no todos (por lo tanto, necesita condiciones). Para algo más simple (simplemente emita un mensaje a todos los clientes sin importar qué), io.sockets.broadcast.emit() es una mejor io.sockets.broadcast.emit() .