Socket.io: Transmitiendo a todos los clientes excepto el problema del remitente

Creado en 22 jun. 2016  ·  4Comentarios  ·  Fuente: socketio/socket.io

He notado este comportamiento extraño al transmitir a otros clientes usando socket.broadcast.emit()
Aquí está el código de muestra del problema:

...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);

que me estoy perdiendo aqui? Por qué # method2 no funciona como se esperaba.
Gracias.

Comentario más útil

¡Hola! socket.broadcast realidad agrega una bandera temporal (es decir, broadcast ) que se usará la próxima vez que se llame a emit en el socket .

La bandera se usa la primera vez y luego se elimina, de ahí el resultado de su segunda llamada.

Todos 4 comentarios

¿Qué devuelve socket.broadcast.to(room) ?

@ Mad-Head Según los documentos, devuelve la misma instancia de socket casi como todos los demás métodos para mantener la capacidad de encadenamiento.
http://socket.io/docs/server-api/#socket #to (habitación: cadena): socket

Lo curioso es que esto es cierto.

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

¡Hola! socket.broadcast realidad agrega una bandera temporal (es decir, broadcast ) que se usará la próxima vez que se llame a emit en el socket .

La bandera se usa la primera vez y luego se elimina, de ahí el resultado de su segunda llamada.

¡Hola! Hm ... tal vez no fui lo suficientemente claro. Déjame hacerlo más obvio:

sample1

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

sample2

    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);

Entonces no está relacionado con la bandera. Los dos ejemplos anteriores deberían funcionar igual, pero no es así. Ese es el problema y me he estado golpeando contra la pared durante medio día para averiguar por qué.

UPD: en realidad @darrachequesne tienes razón. He investigado la fuente: cada vez que se llama emit () _rooms se vacían y el problema extraño ocurrió mientras el setTimeout todavía estaba en progreso, otro método llamado emit () y descargó la habitación (el problema era el ping)

eso fue lo que paso

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.

Muchas gracias por tu sugerencia @darrachequesne.
Cerrando este

¿Fue útil esta página
0 / 5 - 0 calificaciones