Frage

Ist es möglich, alle Clients mit Socket.io zu aktualisieren? Ich habe Folgendes ausprobiert, aber es scheint nicht andere Kunden zu aktualisieren, wenn ein neuer Kunde eine Verbindung herstellt:

Serverside JavaScript:

Ich versuche, eine Nachricht an alle Kunden zu senden, die die aktuelle Anzahl angeschlossener Benutzer enthält. Sie sendet die Anzahl der Benutzer korrekt. Der Client selbst scheint jedoch erst zu aktualisieren, wenn die Seite aktualisiert wurde. Ich möchte, dass dies Echtzeit ist.

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");
  });
});
War es hilfreich?

Lösung

Es wird eigentlich gar nicht ein Update an die anderen Clients gesendet, sondern nur an den Client, der gerade verbunden ist (weshalb Sie das Update beim ersten Laden sehen)

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

Stattdessen möchten Sie emittieren alle Steckdosen

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

Alternativ können Sie die Broadcast -Funktion verwenden, die eine Nachricht an alle außer dem Socket sendet, der sie startet:

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

Andere Tipps

Ich fand das mithilfe dessen Socket.Broadcast.emit () wird nur an die aktuelle "Verbindung" gesendet, aber io.sockets.emit wird an alle Kunden übertragen. Hier hört der Server "zwei Verbindungen" an, die genau 2 Socket sind Namespaces

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

Ich habe versucht zu benutzen io.sockets.emit () In einem Namespace wurde es aber vom Kunden im anderen Namespace empfangen. jedoch Socket.Broadcast.emit () Sendung einfach den aktuellen Socket -Namespace.

Ab Socket.

Hier ist, was ich tue:

Serverseite:

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

Kundenseite:

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.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top