socket.io 1.0.0 ^:使用默认房间与自定义房间进行用户特定通信

时间:2016-02-10 00:08:43

标签: node.js sockets socket.io socket.io-1.0

socket.io 1.4.5,node.js 5.x

前进:在这篇文章之前有很多阅读,努力和失败 - 所以我希望它能帮助很多未来的读者。

当我考虑如何使用默认房间的选项让我很困惑 使用房间进行用户特定的通信(如直接消息)

因为直观,它似乎是一种开箱即用的解决方案 应该弃用为每个用户创建自定义房间的需要 userID或类似this popular solution的电子邮件。

由于它是自动创建的,我认为它应该是我的 并且每个用户只有唯一的监听器。

这导致我尽职尽责地创建此解决方案:

io.on('connection', function(socket){
  var curretUserID = null

  socket.on('set user',function(user){
    userID = curretUserID.id
  });

  io.to(socket.id).emit('welcome','welcome to the room!)

  socket.on('chat message', function(msg){//Makes Sense
    io.emit('chat message', msg);
  });

  socket.on('private message', function(id, msgData){
    if(userID === msg.recipientID){
        socket.to(id).emit('private message', 'for your eyes only');
    }
  });

});

我将userID设置为在父作用域connection内部,以避免在用户和套接字之间创建映射,因为据说这是完全使用会议室解决方案的优势。 / p>

现在我还没有看到有人这样做,所以我不知道我是不是 完全走向无意识的默认房间方向,或者如果是 出于某种原因,这不会在野外扩展或运作良好。

问题:

这是默认房间的预期用途之一,还是正在创建 自定义房间(如上面提到的流行答案)仍然是处理用户特定通信的当前方式吗?

1 个答案:

答案 0 :(得分:1)

理解你的真实问题并不容易,特别是当你混淆所有变量时...但我会尽力回答你的问题。

我认为问题隐藏在服务器端的套接字ID中。 Socket.io在每个socket.id上添加名称空间。因此,让我们说客户端的socket.id4zIISeXsSvKL6VGyAABe,然后在服务器端/#4zIISeXsSvKL6VGyAABe

我希望socket.io团队能解决这个问题,因为他们也在最近的版本中创建了它。

我修复它的方法,我在连接后在客户端更新user.id。

服务器:

io.on('connection', function(socket) {
  socket.emit('register id', socket.id)
}

客户端:

socket.on('register id', function(id){
  socket.id = id
})

然后,可以像这样发送私人消息

服务器:

io.on('connection', function(
  socket.emit('register id', socket.id)

  io.to(socket.id).emit('welcome','welcome to the room!)

  socket.on('chat message', function(msg){//Makes Sense
    io.emit('chat message', msg);
  });

  socket.on('private message', function(msgData){
        socket.to(msg.recipientID).emit('private message', 'for your eyes only');
  });

});