javascript node.js socket.io

javascript - ¿Actualizar todos los clientes usando Socket.io?



node.js (3)

¿Es posible obligar a todos los clientes a actualizar usando socket.io? Intenté lo siguiente, pero no parece actualizar a otros clientes cuando se conecta un nuevo cliente:

JavaScript del servidor:

Estoy intentando enviar un mensaje a todos los clientes, que contiene la cantidad actual de usuarios conectados, envía correctamente la cantidad de usuarios ... sin embargo, el cliente no parece actualizar hasta que la página se haya actualizado. Quiero que esto suceda es en tiempo real.

var clients = 0; io.sockets.on(''connection'', function (socket) { ++clients; socket.emit(''users_count'', clients); socket.on(''disconnect'', function () { --clients; }); });

Clientside JavaScript:

var socket = io.connect(''http://localhost''); socket.on(''connect'', function(){ socket.on(''users_count'', function(data){ $(''#client_count'').text(data); console.log("Connection"); }); });


A partir de la versión 0.9 de socket.io, "emitir" ya no funcionaba para mí, y he estado usando "enviar"

Esto es lo que estoy haciendo:

Lado del servidor :

var num_of_clients = io.sockets.clients().length; io.sockets.send(num_of_clients);

Lado del cliente:

ws = io.connect... ws.on(''message'', function(data) { var sampleAttributes = fullData.split('',''); if (sampleAttributes[0]=="NumberOfClients") { console.log("number of connected clients = "+sampleAttributes[1]); } });


Descubrí que el uso de socket.broadcast.emit () solo se transmitirá a la "conexión" actual, pero io.sockets.emit se transmitirá a todos los clientes. aquí el servidor está escuchando "dos conexiones", que son exactamente 2 espacios de nombres de socket

io.of(''/namespace'').on(''connection'', function(){ socket.broadcast.emit("hello"); }); io.of(''/other namespace'').on(''connection'',function(){/*...*/});

Intenté usar io.sockets.emit () en un espacio de nombres, pero el cliente lo recibió en el otro espacio de nombres. sin embargo, socket.broadcast.emit () simplemente emitirá el espacio de nombres del socket actual.


En realidad, no está enviando una actualización a los demás clientes, sino que simplemente está emitiendo al cliente que acaba de conectarse (por lo que se ve la actualización cuando se carga por primera vez)

// socket is the *current* socket of the client that just connected socket.emit(''users_count'', clients);

En cambio, quieres emitir a todos los sockets

io.sockets.emit(''users_count'', clients);

Alternativamente, puede usar la función de transmisión, que envía un mensaje a todos, excepto el socket que lo inicia:

socket.broadcast.emit(''users_count'', clients);