Socket.io: diffusion à tous les clients sauf problème d'expéditeur

Créé le 22 juin 2016  ·  4Commentaires  ·  Source: socketio/socket.io

J'ai remarqué ce comportement étrange lors de la diffusion à d'autres clients en utilisant socket.broadcast.emit()
Voici l'exemple de code du problème :

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

Qu'est-ce que j'oublie ici? Pourquoi #method2 ne fonctionne pas comme prévu.
Merci.

Commentaire le plus utile

Salut! socket.broadcast ajoute en fait un indicateur temporaire (à savoir, broadcast ) qui sera utilisé la prochaine fois que emit sera appelé sur le socket .

Le drapeau est utilisé la première fois, puis est supprimé, d'où le résultat de votre deuxième appel.

Tous les 4 commentaires

Quels sont les retours de socket.broadcast.to(room) ?

@Mad-Head Selon la documentation, renvoie la même instance de socket presque comme toutes les autres méthodes pour conserver la chaînabilité.
http://socket.io/docs/server-api/#socket #to(room:string):socket

Ce qui est drôle, c'est que cela trace vrai

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

Salut! socket.broadcast ajoute en fait un indicateur temporaire (à savoir, broadcast ) qui sera utilisé la prochaine fois que emit sera appelé sur le socket .

Le drapeau est utilisé la première fois, puis est supprimé, d'où le résultat de votre deuxième appel.

Salut! Hm... peut-être que je n'ai pas été assez clair. Permettez-moi de rendre les choses plus évidentes :

échantillon1

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

échantillon2

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

Ce n'est donc pas lié au drapeau. Les deux exemples ci-dessus devraient fonctionner de la même manière, mais ce n'est pas le cas. C'est le problème et je me suis battu contre le mur pendant une demi-journée pour comprendre pourquoi.

UPD : en fait @darrachequesne tu as raison. J'ai regardé dans la source: chaque fois que l'émetteur () est appelé _rooms est vidé et le problème étrange s'est produit alors que le setTimeout était toujours en cours, une autre méthode appelée émet () et a vidé la pièce (le ping était le problème)

Cest ce qui est arrivé

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.

Merci beaucoup pour votre suggestion @darrachequesne.
Fermeture de celui-ci

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

gCurtisCT picture gCurtisCT  ·  4Commentaires

adammw picture adammw  ·  4Commentaires

karmac2015 picture karmac2015  ·  3Commentaires

renkei picture renkei  ·  4Commentaires

Aweather picture Aweather  ·  4Commentaires