Socket.io: Broadcasting an alle Clients außer Absenderproblem

Erstellt am 22. Juni 2016  ·  4Kommentare  ·  Quelle: socketio/socket.io

Ich habe dieses seltsame Verhalten beim Senden an andere Clients mit socket.broadcast.emit() bemerkt
Hier ist der Beispielcode des Problems:

...notifyOtherClients = function(room, e, data, socket)
{
    // sending to all clients in a room except sender
    var transport = socket.broadcast.to(room);
    //
    setTimeout(function(){
        // #method1: this works as expected: all clients receive event except the sender
        socket.broadcast.to(room).emit(e, data);
        // #method2: this doesn't work though: all clients receive this event. Why?! Bug?
        transport.emit(e, data);
        // logs out 'true'
        console.log(transport === socket.broadcast.to(room));
    }, 
    1000);
};
...
notifyOtherClients("myRoom", "someEvent", { }, socket);

Was fehlt mir hier? Warum #method2 nicht wie erwartet funktioniert.
Vielen Dank.

Hilfreichster Kommentar

Hi! socket.broadcast fügt tatsächlich ein temporäres Flag hinzu (nämlich broadcast ), das beim nächsten Aufruf von emit auf socket .

Das Flag wird das erste Mal verwendet und dann gelöscht, daher das Ergebnis Ihres zweiten Aufrufs.

Alle 4 Kommentare

Was ist die Rendite von socket.broadcast.to(room) ?

@Mad-Head Gibt laut Dokumentation fast die gleiche Socket-Instanz wie alle anderen Methoden zurück, um die Verkettbarkeit beizubehalten.
http://socket.io/docs/server-api/#socket #to(room:string):socket

Das Lustige ist, dass dies wahr ist

console.log(transport === socket.broadcast.to(room));

Hi! socket.broadcast fügt tatsächlich ein temporäres Flag hinzu (nämlich broadcast ), das beim nächsten Aufruf von emit auf socket .

Das Flag wird das erste Mal verwendet und dann gelöscht, daher das Ergebnis Ihres zweiten Aufrufs.

Hi! Hm... vielleicht war ich nicht klar genug. Lassen Sie es mich deutlicher machen:

Probe1

    setTimeout(function(){
        // #method1: this works as expected: all clients receive event except the sender
        socket.broadcast.to(room).emit(e, data);
    }, 
    1000);

Probe2

    var transport = socket.broadcast.to(room);
    setTimeout(function(){
        // #method2: this doesn't work though: all clients receive this event. Why?! Bug?
        transport.emit(e, data);
    }, 
    1000);

Es hat also nichts mit der Flagge zu tun. Die beiden obigen Beispiele sollten gleich funktionieren, tun es aber nicht. Das ist das Problem und ich habe etwa 1/2 am Tag gegen die Wand geschlagen, um herauszufinden, warum.

UPD: eigentlich @darrachequesne hast du recht. Ich habe mir die Quelle angesehen: Jedes Mal, wenn emit() aufgerufen wird, werden _rooms gespült und das seltsame Problem trat auf, als während setTimeout noch im Gange war, eine andere Methode namens emit() und spülte den Raum (Ping war das Problem)

Das ist was passiert ist

1. setup a room with to()
2. start timeout for 1000 ms
...
[some where between 0 and 1000 ms] ping occurs i.e. emit() and flushes the room
...
3. timeout calls socket but the room's already flushed.
4. *problemo* all clients get notified including the sender socket.

Vielen Dank für Ihren Vorschlag @darrachequesne.
Diese schließen

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen