Ist es möglich, alle Clients zu zwingen, mit socket.io zu aktualisieren? Ich habe Folgendes versucht, aber es scheint andere Clients nicht zu aktualisieren, wenn ein neuer Client eine Verbindung herstellt:
Serverseitiges JavaScript:
Ich versuche, eine Nachricht an alle Clients zu senden, die die aktuelle Anzahl der verbundenen 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 in Echtzeit geschieht.
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");
});
});
quelle
io.sockets.emit
außerhalb des Anwendungsbereichs von verwendet werdenio.sockets.on('connection', function (s){...
?Ich habe festgestellt, dass die Verwendung von socket.broadcast.emit () nur an die aktuelle "Verbindung" sendet, io.sockets.emit jedoch an alle Clients. Hier hört der Server "zwei Verbindungen" ab, bei denen es sich genau um zwei 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, aber es wurde vom Client im anderen Namespace empfangen. jedoch socket.broadcast.emit () wird nur den aktuellen Socket - Namespace übertragen.
quelle
Ab socket.io Version 0.9 hat "emit" bei mir nicht mehr funktioniert und ich habe "send" verwendet.
Folgendes mache ich:
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]); } });
quelle
Sie können diesem Beispiel folgen, um Ihr Szenario zu implementieren.
Sie können allen Clients erlauben, sich einem Gemeinschaftsraum anzuschließen, um einige Updates zu senden. Jede Steckdose kann sich wie folgt dem Raum anschließen:
currentSocket.join("client-presence") //can be any name for room
Dann können Sie Clients Schlüssel in Ihre Sockets eingeben lassen, die die Daten mehrerer Clients (ID und Status) enthalten. Wenn sich der Status eines Clients ändert, können Sie ein Änderungsereignis auf dem Socket wie folgt erhalten:
socket.on('STATUS_CHANGE',emitClientsPresence(io,namespace,currentSocket); //event name should be same on client & server side for catching and emiting
und jetzt möchten Sie, dass alle anderen Clients aktualisiert werden, damit Sie Folgendes tun können:
emitClientsPresence => (io,namespace,currentSocket) { io.of(namespace) .to(client-presence) .emit('STATUS_CHANGE', { id: "client 1", status: "changed status" }); }
Dadurch wird das Ereignis STATUS_CHANGE an alle Sockets ausgegeben, die dem Raum "Clientpräsenz" beigetreten sind. Anschließend können Sie dasselbe Ereignis auf der Clientseite abfangen und den Status eines anderen Clients aktualisieren.
quelle