Kirim respons ke semua klien kecuali pengirim

226

Untuk mengirim sesuatu ke semua klien, Anda menggunakan:

io.sockets.emit('response', data);

Untuk menerima dari klien, Anda menggunakan:

socket.on('cursor', function(data) {
  ...
});

Bagaimana saya bisa menggabungkan keduanya sehingga saat menerima pesan di server dari klien, saya mengirim pesan itu ke semua pengguna kecuali yang mengirim pesan?

socket.on('cursor', function(data) {
  io.sockets.emit('response', data);
});

Apakah saya harus memutarnya dengan mengirim id klien dengan pesan dan kemudian memeriksa sisi klien atau apakah ada cara yang lebih mudah?

switz
sumber

Jawaban:

840

Inilah daftar saya (diperbarui untuk 1.0) :

// sending to sender-client only
socket.emit('message', "this is a test");

// sending to all clients, include sender
io.emit('message', "this is a test");

// sending to all clients except sender
socket.broadcast.emit('message', "this is a test");

// sending to all clients in 'game' room(channel) except sender
socket.broadcast.to('game').emit('message', 'nice game');

// sending to all clients in 'game' room(channel), include sender
io.in('game').emit('message', 'cool game');

// sending to sender client, only if they are in 'game' room(channel)
socket.to('game').emit('message', 'enjoy the game');

// sending to all clients in namespace 'myNamespace', include sender
io.of('myNamespace').emit('message', 'gg');

// sending to individual socketid
socket.broadcast.to(socketid).emit('message', 'for your eyes only');

// list socketid
for (var socketid in io.sockets.sockets) {}
 OR
Object.keys(io.sockets.sockets).forEach((socketid) => {});
LearnRPG
sumber
14
Apakah Anda ingin berkontribusi ini ke FAQ ? atau bisakah aku melakukannya untukmu? (Saya akan memberikan backlink di sini)
Kos
1
saya tidak' memiliki iohere.onlysocket
Chovy
2
Sebagai pelengkap // sending to all clients except sender, untuk apa digunakan // sending a response to sender client only ?
Basj
4
Bisakah Anda menambahkannya sesuai soket # in , socket.to('others').emit('an event', { some: 'data' });juga siaran di sebuah ruangan.
gongzhitaao
119
Ini lebih berguna daripada semua yang ada di socket.io docs dikombinasikan
Jonathan.
43

Dari jawaban @LearnRPG tetapi dengan 1.0:

 // send to current request socket client
 socket.emit('message', "this is a test");

 // sending to all clients, include sender
 io.sockets.emit('message', "this is a test"); //still works
 //or
 io.emit('message', 'this is a test');

 // sending to all clients except sender
 socket.broadcast.emit('message', "this is a test");

 // sending to all clients in 'game' room(channel) except sender
 socket.broadcast.to('game').emit('message', 'nice game');

 // sending to all clients in 'game' room(channel), include sender
 // docs says "simply use to or in when broadcasting or emitting"
 io.in('game').emit('message', 'cool game');

 // sending to individual socketid, socketid is like a room
 socket.broadcast.to(socketid).emit('message', 'for your eyes only');

Untuk menjawab komentar @Crashalot, socketidberasal dari:

var io = require('socket.io')(server);
io.on('connection', function(socket) { console.log(socket.id); })
soyuka
sumber
3
Luar biasa! Bagaimana Anda dapat socketidmengirim ke soket individual?
Crashalot
2
Diedit dengan jawaban untuk pertanyaan Anda. Pada dasarnya itu socket.iddari objek soket Anda.
soyuka
untuk mengirim ke individu, Anda dapat menggunakan socket.emit kembali siapa yang mengirimnya atau Anda dapat mengelompokkan klien yang terhubung dan melakukan @Crashalot
ujwal dhakal
12

Berikut ini adalah jawaban yang lebih lengkap tentang apa yang telah berubah dari 0.9.x ke 1.x.

 // send to current request socket client
 socket.emit('message', "this is a test");// Hasn't changed

 // sending to all clients, include sender
 io.sockets.emit('message', "this is a test"); // Old way, still compatible
 io.emit('message', 'this is a test');// New way, works only in 1.x

 // sending to all clients except sender
 socket.broadcast.emit('message', "this is a test");// Hasn't changed

 // sending to all clients in 'game' room(channel) except sender
 socket.broadcast.to('game').emit('message', 'nice game');// Hasn't changed

 // sending to all clients in 'game' room(channel), include sender
 io.sockets.in('game').emit('message', 'cool game');// Old way, DOES NOT WORK ANYMORE
 io.in('game').emit('message', 'cool game');// New way
 io.to('game').emit('message', 'cool game');// New way, "in" or "to" are the exact same: "And then simply use to or in (they are the same) when broadcasting or emitting:" from http://socket.io/docs/rooms-and-namespaces/

 // sending to individual socketid, socketid is like a room
 io.sockets.socket(socketid).emit('message', 'for your eyes only');// Old way, DOES NOT WORK ANYMORE
 socket.broadcast.to(socketid).emit('message', 'for your eyes only');// New way

Saya ingin mengedit posting @soyuka tetapi hasil edit saya ditolak oleh peer-review.

Vadorequest
sumber
6

broadcast.emit mengirim pesan ke semua klien lain (kecuali pengirim)

socket.on('cursor', function(data) {
  socket.broadcast.emit('msg', data);
});
Khaled Jouda
sumber
6

Keluarkan cheatsheet

io.on('connect', onConnect);

function onConnect(socket){

  // sending to the client
  socket.emit('hello', 'can you hear me?', 1, 2, 'abc');

  // sending to all clients except sender
  socket.broadcast.emit('broadcast', 'hello friends!');

  // sending to all clients in 'game' room except sender
  socket.to('game').emit('nice game', "let's play a game");

  // sending to all clients in 'game1' and/or in 'game2' room, except sender
  socket.to('game1').to('game2').emit('nice game', "let's play a game (too)");

  // sending to all clients in 'game' room, including sender
  io.in('game').emit('big-announcement', 'the game will start soon');

  // sending to all clients in namespace 'myNamespace', including sender
  io.of('myNamespace').emit('bigger-announcement', 'the tournament will start soon');

  // sending to individual socketid (private message)
  socket.to(<socketid>).emit('hey', 'I just met you');

  // sending with acknowledgement
  socket.emit('question', 'do you think so?', function (answer) {});

  // sending without compression
  socket.compress(false).emit('uncompressed', "that's rough");

  // sending a message that might be dropped if the client is not ready to receive messages
  socket.volatile.emit('maybe', 'do you really need it?');

  // sending to all clients on this node (when using multiple nodes)
  io.local.emit('hi', 'my lovely babies');

};
Prasanna Brabourame
sumber
4

Untuk ruang nama di dalam ruangan yang melingkar daftar klien di ruangan (mirip dengan jawaban Nav) adalah salah satu dari hanya dua pendekatan yang saya temukan yang akan bekerja. Yang lainnya adalah menggunakan exclude. MISALNYA

socket.on('message',function(data) {
    io.of( 'namespace' ).in( data.roomID ).except( socket.id ).emit('message',data);
}
runspired
sumber
7
kecuali telah dihapus dari 1.x: /
coulix
1

Kasus lainnya

io.of('/chat').on('connection', function (socket) {
    //sending to all clients in 'room' and you
    io.of('/chat').in('room').emit('message', "data");
};
Kim Thien Dung
sumber
1

Memperbarui daftar untuk dokumentasi lebih lanjut.

socket.emit('message', "this is a test"); //sending to sender-client only
socket.broadcast.emit('message', "this is a test"); //sending to all clients except sender
socket.broadcast.to('game').emit('message', 'nice game'); //sending to all clients in 'game' room(channel) except sender
socket.to('game').emit('message', 'enjoy the game'); //sending to sender client, only if they are in 'game' room(channel)
socket.broadcast.to(socketid).emit('message', 'for your eyes only'); //sending to individual socketid
io.emit('message', "this is a test"); //sending to all clients, include sender
io.in('game').emit('message', 'cool game'); //sending to all clients in 'game' room(channel), include sender
io.of('myNamespace').emit('message', 'gg'); //sending to all clients in namespace 'myNamespace', include sender
socket.emit(); //send to all connected clients
socket.broadcast.emit(); //send to all connected clients except the one that sent the message
socket.on(); //event listener, can be called on client to execute on server
io.sockets.socket(); //for emiting to specific clients
io.sockets.emit(); //send to all connected clients (same as socket.emit)
io.sockets.on() ; //initial connection from a client.

Semoga ini membantu.

Kent Aguilar
sumber
'io.sockets.emit' sama dengan 'io.emit', bukan 'socket.emit'
Doctor.Who.
'socket.to (' game '). memancarkan' sama dengan 'socket.broadcast.to (' game '). memancarkan' sehingga komentar di atas salah
Doctor.Who.
0

gunakan kode ini

io.sockets.on('connection', function (socket) {

    socket.on('mousemove', function (data) {

        socket.broadcast.emit('moving', data);
    });

socket.broadcast.emit () ini akan memancarkan apapun dalam fungsi kecuali ke server yang memancarkan

Abi
sumber
1
bagaimana Anda masuk ke iodalam ini jika callback didefinisikan dalam file anther
chovy
Saya memiliki aplikasi saya di banyak file, dan saya menggabungkannya dengan PrePros atau Koala alih-alih membutuhkannya, ini memungkinkan saya untuk berbagi semua variabel mereka
Steel Brain
1
Atau memiliki ioglobal
Vadorequest
0

Saya menggunakan ruang nama dan kamar - saya temukan

socket.broadcast.to('room1').emit('event', 'hi');

untuk bekerja dimana

namespace.broadcast.to('room1').emit('event', 'hi');

tidak

(harus ada orang lain yang menghadapi masalah itu)

reowow
sumber