webentwicklung-frage-antwort-db.com.de

Alle Clients mit Socket.io aktualisieren?

Ist es möglich, alle Clients zu zwingen, ein Update mit socket.io durchzuführen? Ich habe Folgendes versucht, aber es scheint, dass andere Clients nicht aktualisiert werden, wenn ein neuer Client eine Verbindung herstellt:

Serverseitige JavaScript:

Ich versuche, eine Nachricht an alle Clients zu senden, die die aktuelle Anzahl der verbundenen Benutzer enthält. Die Anzahl der Benutzer wird korrekt gesendet. Der Client selbst scheint jedoch nicht zu aktualisieren, bis die Seite aktualisiert wurde. Ich möchte, dass dies in Echtzeit geschieht.

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

Clientseitiges 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

Es wird nicht wirklich ein Update an die anderen Clients gesendet, sondern es wird nur an den Client gesendet, 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 an all / sockets senden

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

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

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

Ich habe festgestellt, dass die Verwendung vonsocket.broadcast.emit ()nur zur aktuellen "Verbindung" gesendet wird, aberio.sockets.emitan alle Clients gesendet wird. Hier hört der Server "zwei Verbindungen" an, bei denen es sich genau um 2 Socket Namespaces handelt.

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

ich habe versucht,io.sockets.emit ()in einem Namespace zu verwenden, es wurde jedoch vom Client im anderen Namespace empfangen. Allerdings sendetsocket.broadcast.emit ()nur den aktuellen Socket-Namespace. 

13
houkanshan

Ab Socket.io Version 0.9 funktionierte "emit" nicht mehr für mich und ich verwende "send"

Folgendes mache ich:

Serverseite :

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

Client-Seite:

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