Question

Est-il possible de forcer tous les clients à mettre à jour en utilisant socket.io? J'ai essayé ce qui suit, mais il ne semble pas mettre à jour d'autres clients lorsqu'un nouveau client se connecte:

Serverside JavaScript:

Je tente d'envoyer un message à tous les clients, qui contient le nombre actuel d'utilisateurs connectés, il envoie correctement le nombre d'utilisateurs .... mais le client lui-même ne semble pas mise à jour jusqu'à ce que la page a été rafraîchi. Je veux que cela se produise est en temps réel.

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");
  });
});
Était-ce utile?

La solution

Il est pas réellement envoyer une mise à jour aux autres clients du tout, au lieu, il est juste émettait au client qui vient de se connecter (ce qui est la raison pour laquelle vous voyez la mise à jour lors de la première charge)

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

, vous voulez d'émettre à la place tous prises

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

Vous pouvez également utiliser la fonction de diffusion, qui envoie un message à tout le monde, sauf la prise qui commence il:

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

Autres conseils

Je trouve que l'utilisation de socket.broadcast.emit () ne diffusera à la "connexion" en cours, mais io.sockets.emit diffusera à tous les clients. ici le serveur est à l'écoute de "deux connexions", qui sont exactlly 2 socket namespaces

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

Je dois essayer d'utiliser io.sockets.emit () dans un espace de noms, mais il a été reçu par le client dans l'autre espace de noms. mais socket.broadcast.emit () simplement diffuser l'espace de noms de prise de courant.

de socket.io version 0.9, "Emit" ne travaillait plus pour moi, et je me sers "envoyer"

Voici ce que je fais:

Side serveur :

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

Côté client:

ws = io.connect...
ws.on('message', function(data)
{
var sampleAttributes = fullData.split(',');
if (sampleAttributes[0]=="NumberOfClients")
        {
            console.log("number of connected clients = "+sampleAttributes[1]);
        }
});
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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top