Socket.io phòng khác biệt giữa broadcast.to và sockets.in


102

Readme của Socket.io chứa ví dụ sau:

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

Sự khác biệt giữa socket.broadcast.to()và là io.sockets.in()gì?


14
ủng hộ cho dữ liệu mẫu
dave

Câu trả lời:


122

socket.broadcast.tophát tới tất cả các ổ cắm trong phòng nhất định, ngoại trừ ổ cắm mà nó được gọi trong khi io.sockets.inphát tới tất cả các ổ cắm trong phòng nhất định.


1
kênh khác với phòng ở điểm nào?
vsync

6
không có. Tên khác nhau cho cùng một thứ.
mike_hornbeck

socket.io sử dụng thuật ngữ phòng thay vì kênh. phòng / kênh không được nhầm lẫn với không gian tên trong socket.io. Tôi đã cập nhật câu trả lời của mình để sử dụng thuật ngữ chính xác.
Daniel Baulig

40

Node.js là thứ mà tôi thực sự quan tâm và tôi đã sử dụng nó trong một trong những dự án của mình để tạo một trò chơi nhiều người chơi.

io.sockets.in().emit()socket.broadcast.to().emit()là hai phương thức phát chính mà chúng tôi sử dụng trong Phòng của Socket.io ( https://github.com/LearnBoost/socket.io/wiki/Rooms ) Phòng cho phép phân vùng đơn giản các máy khách được kết nối. Điều này cho phép các sự kiện được gửi tới các tập con của danh sách ứng dụng khách được kết nối và đưa ra một phương pháp quản lý chúng đơn giản.

Chúng cho phép chúng tôi quản lý các tập hợp con của danh sách khách hàng được kết nối (mà chúng tôi gọi là phòng) và có các chức năng tương tự như chức năng socket.io chính io.sockets.emit()socket.broadcast.emit() .

Dù sao tôi sẽ cố gắng cung cấp các mã ví dụ với các nhận xét để giải thích. Xem nếu nó giúp;

Phòng Socket.io

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

/* 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 (). nhũ ();

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

    }
}

Chúc mừng


35

Cập nhật 2019 : socket.io là một mô-đun đặc biệt sử dụng websockets và sau đó dự phòng cho cuộc thăm dò yêu cầu http. Chỉ đối với websockets: đối với máy khách sử dụng websockets gốc và đối với node.js sử dụng ws hoặc thư viện này.

Ví dụ đơn giản

Cú pháp khó hiểu trong socketio. Ngoài ra, mọi ổ cắm được tự động kết nối với phòng riêng của họ bằng id socket.id(đây là cách trò chuyện riêng tư hoạt động trong socketio, họ sử dụng phòng).

Gửi cho người gửi và không ai khác

socket.emit('hello', msg);

Gửi cho tất cả mọi người kể cả người gửi (nếu người gửi đang ở trong phòng) trong phòng "my room"

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

Gửi cho tất cả mọi người trừ người gửi (nếu người gửi đang ở trong phòng) trong phòng "phòng của tôi"

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

Gửi cho mọi người trong mọi phòng , kể cả người gửi

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

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

Chỉ gửi đến một ổ cắm cụ thể (trò chuyện riêng tư)

socket.broadcast.to(otherSocket.id).emit('hello', msg);

Cách tìm otherSocket.id . đặt nó ở đâu?
Iman Marashi

@ImanMarashi Tất cả những gì bạn cần làm là lấy đối tượng socket khác và sau đó truy cập thuộc tính id của nó. otherSocket.on('connect',()=> { console.log(otherSocket.id); });
K - Độc tính trong SO ngày càng lớn.

Tuyệt vời ! io.to ('phòng của tôi'). release ('hello', msg); help me của nó :)
iamkdblue

@ImanMarashi bạn lưu otherSocket.id trong một mảng hoặc đối tượng bên ngoài. Và truy cập nó sau đó từ bất kỳ ổ cắm nào đang được gọi.
K - Độc tính trong SO ngày càng lớn.

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

};

Bạn có thể cung cấp lời giải thích kèm theo mã không? Nói chung, chỉ cần cung cấp mã là bạn sẽ khó chịu. Tuy nhiên, tôi có thể thấy rằng mã của bạn được nhận xét tốt :)
MBorg

1

Trong Socket.IO 1.0, .to () và .in () giống nhau. Và những người khác trong phòng sẽ nhận được tin nhắn. Khách hàng gửi nó sẽ không nhận được tin nhắn.

Kiểm tra mã nguồn (v1.0.6):

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


.to(),ingiống nhau, thì điều gì sẽ xảy ra khi tôi tạo một phòng có tên giống hệt như id của ổ cắm nào đó. Điều gì sẽ socket.broadcast.to(socketid)ví dụ làm gì?
Gust van de Wal,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.