Ruang Socket.io perbedaan antara broadcast.to dan sockets.in

102

Readme Socket.io berisi contoh berikut:

    var io = require('socket.io').listen(80);

    io.sockets.on('connection', function (socket) {
      socket.join('justin bieber fans');
      socket.broadcast.to('justin bieber fans').emit('new fan');
      io.sockets.in('rammstein fans').emit('new non-fan');
    });

Apa perbedaan antara socket.broadcast.to()dan io.sockets.in()?

knex
sumber
14
suara positif untuk data contoh
dave

Jawaban:

122

socket.broadcast.tomenyiarkan ke semua soket di ruangan tertentu, kecuali ke soket yang digunakan untuk memanggilnya saat io.sockets.inmenyiarkan ke semua soket di ruangan tertentu.

Daniel Baulig
sumber
1
dalam hal apa saluran berbeda dengan ruangan?
vsync
6
tidak ada. Nama berbeda untuk hal yang sama.
mike_hornbeck
socket.io menggunakan istilah ruang, bukan saluran. kamar / saluran jangan disamakan dengan namespace di socket.io sekalipun. Saya memperbarui jawaban saya untuk menggunakan istilah yang benar.
Daniel Baulig
40

Node.js adalah sesuatu yang saya sangat tertarik sebelumnya dan saya menggunakannya di salah satu proyek saya untuk membuat game multipemain.

io.sockets.in().emit()dan socket.broadcast.to().emit()merupakan dua metode emisi utama yang kami gunakan di Kamar Socket.io ( https://github.com/LearnBoost/socket.io/wiki/Rooms ) Ruangan memungkinkan partisi sederhana dari klien yang terhubung. Hal ini memungkinkan peristiwa untuk dipancarkan ke subset dari daftar klien yang terhubung, dan memberikan metode sederhana untuk mengelolanya.

Mereka memungkinkan kita untuk mengelola subset dari daftar klien yang terhubung (yang kita sebut kamar) dan memiliki fungsi serupa seperti fungsi socket.io utama io.sockets.emit()dan socket.broadcast.emit().

Pokoknya saya akan mencoba memberikan kode contoh dengan komentar untuk menjelaskan. Lihat apakah itu membantu;

Kamar Socket.io

i) io.sockets.in (). emit ();

/* Send message to the room1. It broadcasts the data to all 
   the socket clients which are connected to the room1 */

io.sockets.in('room1').emit('function', {foo:bar});

ii) socket.broadcast.to (). emit ();

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

        /* Broadcast to room1 except the sender. In other word, 
            It broadcast all the socket clients which are connected 
            to the room1 except the sender */
        socket.broadcast.to('room1').emit('function', {foo:bar});

    }
}

Socket.io

i) io.sockets.emit ();

/* Send message to all. It broadcasts the data to all 
   the socket clients which are connected to the server; */

io.sockets.emit('function', {foo:bar});

ii) socket.broadcast.emit ();

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

        // Broadcast to all the socket clients except the sender
        socket.broadcast.emit('function', {foo:bar}); 

    }
}

Bersulang

Tank Gokhan
sumber
35

Pembaruan 2019 : socket.io adalah modul khusus yang menggunakan websockets dan kemudian kembali ke http request polling. Untuk websockets saja: untuk klien gunakan websockets asli dan untuk node.js gunakan ws atau library ini.

Contoh sederhana

Sintaksnya membingungkan di socketio. Juga, setiap soket secara otomatis terhubung ke kamar mereka sendiri dengan id socket.id(ini adalah cara kerja obrolan pribadi di socketio, mereka menggunakan kamar).

Kirim ke pengirim dan tidak ada orang lain

socket.emit('hello', msg);

Kirim ke semua orang termasuk pengirim (jika pengirim ada di kamar) di kamar "kamar saya"

io.to('my room').emit('hello', msg);

Kirim ke semua orang kecuali pengirim (jika pengirim ada di kamar) di kamar "kamar saya"

socket.broadcast.to('my room').emit('hello', msg);

Kirim ke semua orang di setiap ruangan , termasuk pengirim

io.emit('hello', msg); // short version

io.sockets.emit('hello', msg);

Kirim ke soket tertentu saja (obrolan pribadi)

socket.broadcast.to(otherSocket.id).emit('hello', msg);
K - Toksisitas pada SO meningkat.
sumber
Bagaimana menemukan otherSocket.id . dimana mengaturnya?
Iman Marashi
@ImanMarashi Yang perlu Anda lakukan adalah mendapatkan objek soket lain dan kemudian mengakses properti id-nya. otherSocket.on('connect',()=> { console.log(otherSocket.id); });
K - Toksisitas pada SO meningkat.
Hebat! io.to ('my room'). emit ('hello', msg); ini membantu saya :)
iamkdblue
@ImanMarashi Anda menyimpan otherSocket.id dalam larik atau objek di luar. Dan akses nanti dari soket mana pun yang dipanggil.
K - Toksisitas pada SO meningkat.
2
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 a specific room in a specific namespace, including sender
  io.of('myNamespace').to('room').emit('event', 'message');

  // sending to individual socketid (private message)
  io.to(`${socketId}`).emit('hey', 'I just met you');

  // WARNING: `socket.to(socket.id).emit()` will NOT work, as it will send to everyone in the room
  // named `socket.id` but the sender. Please use the classic `socket.emit()` instead.

  // 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?');

  // specifying whether the data to send has binary data
  socket.binary(false).emit('what', 'I have no binaries!');

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

  // sending to all connected clients
  io.emit('an event sent to all connected clients');

};
sun1211
sumber
Bisakah Anda memberikan penjelasan untuk menyertai kode? Umumnya hanya memberikan kode tidak disukai. Namun, saya dapat melihat bahwa kode Anda dikomentari dengan baik :)
MBorg
1

Di Socket.IO 1.0, .to () dan .in () sama. Dan orang lain di ruangan itu akan menerima pesan tersebut. Klien mengirimkannya tidak akan menerima pesan.

Lihat kode sumber (v1.0.6):

https://github.com/Automattic/socket.io/blob/a40068b5f328fe50a2cd1e54c681be792d89a595/lib/socket.js#L173

James J. Ye
sumber
Karena .to()dan ,insama, lalu apa yang akan terjadi jika saya membuat ruangan dengan nama yang sama persis dengan beberapa ID soket. socket.broadcast.to(socketid)Misalnya, apa yang akan dilakukan?
Gust van de Wal