【问题标题】:socket.io - broadcast to certain userssocket.io - 向特定用户广播
【发布时间】:2012-07-14 03:02:20
【问题描述】:

我需要使用 websockets (socket.io + node.js) 建立两个聊天。 因此,向所有用户广播消息的简单示例:

socket.on('user message', function (msg) {
    socket.broadcast.emit('user message', socket.nickname, msg);
  });

但是我怎样才能从某个用户向某个用户广播呢?

【问题讨论】:

    标签: javascript node.js websocket socket.io


    【解决方案1】:

    有两种可能:

    1) 每个套接字都有自己的唯一 ID,存储在 socket.id 中。如果您知道两个用户的 ID,那么您可以简单地使用

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

    2)定义自己的ID(例如用户名)并使用

    socket.join('priv/John');
    

    connection 处理程序中。现在,只要您只想向John 发送消息,您只需这样做

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

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

    【讨论】:

    • 我用 Rails 将用户存储在 MySQL 中,那么,如何将用户 ID 从 db 关联到套接字 ID?
    • 小问:是否将用户添加到多个房间(使用join)会对服务器造成负载?
    • @MarkPegasov 抱歉回复晚了。您必须将具体套接字映射到用户 ID。为此,您需要一些身份验证机制。
    • @Shlomi 是的,您所做的几乎所有事情都会消耗一些资源。然而,在这种具体情况下,性能损失应该可以忽略不计。但始终测量。
    【解决方案2】:

    您可以使用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
    

    【讨论】:

    • 这里有很好的例子
    猜你喜欢
    • 2016-01-02
    • 2020-12-14
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多