Socket.io: menyiarkan ke semua klien kecuali masalah pengirim

Dibuat pada 22 Jun 2016  ·  4Komentar  ·  Sumber: socketio/socket.io

Saya memperhatikan perilaku aneh ini saat menyiarkan ke klien lain menggunakan socket.broadcast.emit()
Berikut contoh kode masalahnya:

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

Apa yang kulewatkan di sini? Mengapa #method2 tidak berfungsi seperti yang diharapkan.
Terima kasih.

Komentar yang paling membantu

Hai! socket.broadcast sebenarnya menambahkan flag sementara (yaitu, broadcast ) yang akan digunakan saat berikutnya emit dipanggil pada socket .

Bendera digunakan pertama kali, dan kemudian dihapus, oleh karena itu hasil dari panggilan kedua Anda.

Semua 4 komentar

Apa pengembalian dari socket.broadcast.to(room) ?

@Mad-Head Menurut dokumen, mengembalikan instance soket yang sama hampir seperti semua metode lain untuk menjaga kemampuan rantai.
http://socket.io/docs/server-api/#socket #to(room:string):socket

Yang lucu adalah jejak ini benar

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

Hai! socket.broadcast sebenarnya menambahkan flag sementara (yaitu, broadcast ) yang akan digunakan saat berikutnya emit dipanggil pada socket .

Bendera digunakan pertama kali, dan kemudian dihapus, oleh karena itu hasil dari panggilan kedua Anda.

Hai, yang di sana! Hm... mungkin saya kurang jelas. Biarkan saya membuatnya lebih jelas:

sampel1

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

sampel2

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

Jadi tidak terkait bendera. Kedua sampel di atas seharusnya berfungsi sama, tetapi tidak. Itulah masalahnya dan saya telah memukul dinding selama 1/2 hari untuk mencari tahu mengapa.

UPD: sebenarnya @darrachequesne Anda benar. Saya telah melihat ke sumbernya: setiap kali emit() disebut _rooms di-flush dan masalah aneh terjadi ketika setTimeout masih dalam proses, metode lain yang disebut emit() dan membersihkan ruangan (ping adalah masalahnya)

itulah yang terjadi

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.

Terima kasih banyak atas saran Anda @darrachequesne.
Menutup yang ini

Apakah halaman ini membantu?
0 / 5 - 0 peringkat