Alle Clients mit Socket.io aktualisieren?

Lesezeit: 4 Minuten

Benutzer-Avatar
Jack

Ist es möglich, alle Clients mit socket.io zum Update zu zwingen? 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. Die Anzahl der Benutzer wird korrekt gesendet. Der Client selbst scheint jedoch nicht aktualisiert zu werden, 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");
  });
});

Benutzer-Avatar
Matt

Es sendet überhaupt kein Update an die anderen Clients, sondern nur an den Client, der gerade eine Verbindung hergestellt hat (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 sendet, außer an den Socket, der sie startet:

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

  • Danke, gibt es einen Unterschied zwischen der Verwendung von Broadcast und der Verwendung von io.sockets.emit?

    – Jack

    8. September 2011 um 18:28 Uhr

  • @Jack Laut Dokumentation bedeutet “Broadcasting das Senden einer Nachricht an alle anderen mit Ausnahme des Sockets, der sie startet.”, wobei ich erwarten würde, dass der andere sie an alle sendet.

    – Matt

    8. September 2011 um 18:52 Uhr


  • Anscheinend habe ich den Fehler gemacht, diese Antwort als Bearbeitung zu korrigieren. Da die Bearbeitung abgelehnt wurde, hier noch einmal: socket.broadcast.emit und io.sockets.emit sind keine Alternativen zueinander in dem Sinne, dass sie einen großen Unterschied haben. Die Broadcast-Variante sendet an alle Buchsen außer an den Trigger-Socket, während die io.sockets-Methode wirklich an alle Sockets ausgibt.

    – Tiago Espinha

    21. Januar 2013 um 14:35 Uhr

  • Kann das io.sockets.emit außerhalb des Anwendungsbereichs verwendet werden io.sockets.on('connection', function (s){... ?

    – vsync

    8. Mai 2013 um 15:00 Uhr


  • @Matt mit der neuesten Socket.IO-API, io.sockets.emit funktioniert nicht, verwenden Sie stattdessen io.emit.

    – Gianluca Casati

    26. Januar 2018 um 18:59 Uhr

Benutzer-Avatar
houkanshan

Das habe ich mit gefunden socket.broadcast.emit() wird nur an die aktuelle “Verbindung” gesendet, aber io.sockets.emit wird an alle Clients übertragen. hier hört der Server auf “zwei Verbindungen”, die genau 2 Sockets sind Namensräume

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

Ich habe versuchen zu verwenden io.sockets.emit() in einem Namensraum, wurde aber vom Client im anderen Namensraum empfangen. jedoch socket.broadcast.emit() sendet nur den aktuellen Socket-Namespace.

Ab socket.io Version 0.9 funktionierte “emit” nicht mehr für mich 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]);
        }
});

  • Dann müssen Sie etwas falsch machen … Die aktuelle Dokumentation lautet “emit”. socket.io/docs

    – Adam

    23. August 2015 um 21:30 Uhr

Benutzer-Avatar
Rdavial

Sie können diesem Beispiel folgen, um Ihr Szenario zu implementieren.

Sie können allen Clients erlauben, einem gemeinsamen Raum beizutreten, um einige Updates zu senden. Jede Steckdose kann wie folgt mit einem Raum verbunden werden:

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

Dann können Sie Clients in Ihre Sockets eingeben, die mehrere Clientdaten (ID und Status) enthalten, und wenn sich der Status eines Clients ändert, können Sie ein Änderungsereignis für Sockets 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, also können Sie Folgendes tun:

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

Dadurch wird das STATUS_CHANGE-Ereignis an alle Sockets ausgegeben, die dem „Client-Presence“-Raum beigetreten sind, und dann können Sie dasselbe Ereignis auf der Client-Seite abfangen und den Status anderer Clients aktualisieren.

Demzufolge Rundfunk. Mit nodejs-Server können Sie dies verwenden:

io.emit('event_id', {your_property: 'your_property_field'});

Stellen Sie sicher, dass Sie Websocket initialisieren, zum Beispiel:

var express = require('express');
var http = require('http');
var app = express();
var server = http.Server(app);
var io = require('socket.io')(server);

app.get("https://stackoverflow.com/", function (req, res) {
    res.send('Hello World!');
    io.emit('event_hello', {message: 'Hello Socket'});
});

server.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

In diesem Fall wird, wenn der Benutzer Ihren Server erreicht, „event_hello“ mit einem json-Objekt {message: ‘Hello Socket’} an alle Web-Socket-Clients gesendet.

1136120cookie-checkAlle Clients mit Socket.io aktualisieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy