node.js Socket.io 房间在 broadcast.to 和 sockets.in 之间的区别

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6873607/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 14:25:29  来源:igfitidea点击:

Socket.io rooms difference between broadcast.to and sockets.in

node.jssocket.io

提问by knex

Socket.io's readme contains the following example:

Socket.io 的自述文件包含以下示例:

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

What's the difference between socket.broadcast.to()and io.sockets.in()?

socket.broadcast.to()和 和有io.sockets.in()什么区别?

回答by Daniel Baulig

socket.broadcast.tobroadcasts to all sockets in the given room, exceptto the socket on which it was called while io.sockets.inbroadcasts to all sockets in the given room.

socket.broadcast.to广播到给定房间中的所有套接字,除了调用它的套接字,同时io.sockets.in广播给给定房间中的所有套接字。

回答by Gokhan Tank

Node.js was something I was really interested forawhile and I used it in one of my project to make a multiplayer game.

Node.js 是我真正感兴趣的东西,我在我的一个项目中使用它来制作多人游戏。

io.sockets.in().emit()and socket.broadcast.to().emit()are the main two emit methods we use in Socket.io's Rooms (https://github.com/LearnBoost/socket.io/wiki/Rooms) Rooms allow simple partitioning of the connected clients. This allows events to be emitted with to subsets of the connected client list, and gives a simple method of managing them.

io.sockets.in().emit()socket.broadcast.to().emit()是我们在 Socket.io 的房间 ( https://github.com/LearnBoost/socket.io/wiki/Rooms) 中使用的主要两种发射方法,房间允许对连接的客户端进行简单分区。这允许将事件与连接的客户端列表的子集一起发出,并提供一种管理它们的简单方法。

They allow us to manage the subsets of the connected client list(which we call rooms) and have the similiar functionalities like the main socket.io functions io.sockets.emit()and socket.broadcast.emit().

它们允许我们管理连接的客户端列表(我们称之为房间)的子集,并具有类似的功能,如主要的 socket.io 功能io.sockets.emit()socket.broadcast.emit().

Anyway I'll try to give the example codes with the comments to explain. See if it helps;

无论如何,我会尝试给出带有注释的示例代码来解释。看看是否有帮助;

Socket.io Rooms

Socket.io 房间

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

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

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

Socket.io

i) io.sockets.emit();

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

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

    }
}

Cheers

干杯

回答by Karl Morrison

Update 2019: socket.io is a special module which uses websockets and then fallsback to http request polling. For just websockets: for the client use native websockets and for node.js use ws or this library.

2019 年更新:socket.io 是一个特殊模块,它使用 websockets 然后回退到 http 请求轮询。对于 websockets:对于客户端使用原生 websockets,对于 node.js 使用 ws 或这个库。

Simple example

简单的例子

The syntax is confusing in socketio. Also, every socket is automatically connected to their own room with the id socket.id(this is how private chat works in socketio, they use rooms).

socketio 中的语法令人困惑。此外,每个套接字都会使用 id 自动连接到他们自己的房间socket.id(这是 socketio 中私人聊天的工作方式,他们使用房间)。

Send to the sender and noone else

发送给发件人而不是其他人

socket.emit('hello', msg);

Send to everyone includingthe sender(if the sender is in the room) in the room "my room"

发送给房间“我的房间”中的所有人,包括发件人(如果发件人在房间内)

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

Send to everyone exceptthe sender(if the sender is in the room) in the room "my room"

发送给房间“我的房间”中发件人之外的所有人(如果发件人在房间内)

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

Send to everyone in every room, includingthe sender

发送给每个房间的每个人,包括发件人

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

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

Send to specific socket only (private chat)

仅发送到特定套接字(私人聊天)

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

回答by sun1211

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

};

回答by James J. Ye

In Socket.IO 1.0, .to() and .in() are the same. And others in the room will receive the message. The client sends it won't receive the message.

在 Socket.IO 1.0 中, .to() 和 .in() 是相同的。房间里的其他人会收到消息。客户端发送它不会收到消息。

Check out source code (v1.0.6):

查看源代码(v1.0.6):

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

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