Socket.io - 向特定用户广播

6
我需要构建一个双人聊天室,使用websockets(socket.io + node.js)。 以下是向所有用户广播消息的简单示例:
socket.on('user message', function (msg) {
    socket.broadcast.emit('user message', socket.nickname, msg);
  });

但是我如何将它从某个用户广播到另一个用户呢?
2个回答

20

有两种可能:

1) 每个 socket 都有其自己独特的 ID 存储在 socket.id 中。如果您知道两个用户的 ID,则可以简单地使用:

io.sockets[id].emit(...)

2) 定义您自己的ID(例如用户的名称),并使用它。

socket.join('priv/John');

connection处理程序中。现在,每当您想向John发送消息时,只需执行以下操作:

socket.broadcast.to('priv/John').emit(...)

顺便提一下:第一个解决方案不能扩展到多台机器,所以我建议使用第二个。


2
我使用Rails将用户存储在MySQL中,那么我该如何将数据库中的用户ID与套接字ID关联起来呢? - Mark Pegasov
小问题:将用户添加到多个房间(使用“join”)会对服务器造成负载吗? - Shlomi
@MarkPegasov,非常抱歉回复晚了。您需要将具体的套接字映射到用户ID上。为此,您需要一些身份验证机制。 - freakish
1
@Shlomi 是的,你做的几乎所有事情都会消耗一些资源。但是在这个具体的案例中,性能影响应该可以忽略不计。不过,始终要进行测量。 - freakish

4

你可以使用socket.join(...)函数来提供分组:

socket.on('init', function(user) {
  if (user.type == 'dog') {
    socket.join('dogs');
  }
  else {
    socket.join('cats');
  }
});

...

io.to('dogs').emit('food', 'bone'); // Only dogs will receive it
io.to('cats').emit('food', 'milk'); // Only cats will receive it

这里有一个很好的例子。 - anthony_718

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接