it-swarm.it

Aggiorna tutti i client usando Socket.io?

È possibile forzare l'aggiornamento di tutti i client usando socket.io? Ho provato quanto segue, ma non sembra aggiornare altri client quando un nuovo client si connette:

JavaScript server:

Sto tentando di inviare un messaggio a tutti i client, che contiene il numero corrente di utenti connessi, invia correttamente la quantità di utenti .... tuttavia il client stesso non sembra aggiornarsi fino a quando la pagina non è stata aggiornata. Voglio che questo accada è in tempo reale.

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");
  });
});
72
Jack

In realtà non sta inviando un aggiornamento agli altri client, ma emette semplicemente sul client che è appena connesso (ecco perché vedi l'aggiornamento quando carichi per la prima volta)

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

Invece, si desidera emettere su all socket

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

In alternativa, è possibile utilizzare la funzione di trasmissione, che invia un messaggio a tutti tranne il socket che lo avvia:

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

Ho trovato che usaresocket.broadcast.emit ()trasmetterà solo alla "connessione" corrente, maio.sockets.emittrasmetterà a tutti i client. Qui il server sta ascoltando "due connessioni", che sono esattamente 2 socket namespace

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

ho provato a usareio.sockets.emit ()in un namespace ma è stato ricevuto dal client nell'altro spazio dei nomi. tuttaviasocket.broadcast.emit ()trasmetterà solo lo spazio dei nomi del socket corrente. 

13
houkanshan

A partire da socket.io versione 0.9, "emit" non funzionava più per me, e ho usato "invia"

Ecco cosa sto facendo:

Lato server :

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

Dalla parte 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]);
        }
});
3
Katie S
You can follow this example for implementing your scenario.

You can let all of clients to join a common room for sending some updates.
Every socket can join room like this: 

currentSocket.join("client-presence") //can be any name for room

Then you can have clients key in you sockets which contains multiple client's data(id and status) and if one client's status changes you can receive change event on socket like this:

socket.on('STATUS_CHANGE',emitClientsPresence(io,namespace,currentSocket); //event name should be same on client & server side for catching and emiting

and now you want all other clients to get updated, so you can do something like this:

emitClientsPresence => (io,namespace,currentSocket) {
  io.of(namespace)
        .to(client-presence)
        .emit('STATUS_CHANGE', { id: "client 1", status: "changed status" });
}

This will emit STATUS_CHANGE event to all sockets that have joined "client-presence" room and then you can catch same event on client side and update other client's status.
0
Rdavial