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

socket.io 1.4.5,node.js 5.x.

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

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

因为直观地说,它似乎是一种开箱即用的解决方案
应该弃用为每个用户创建自定义房间的需要
用户ID或电子邮件,如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设置为在父作用域连接内部生存,以避免在用户和套接字之间创建映射,因为据说这是完全使用会议室解决方案的优势.

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

题:

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

最佳答案 理解你的真实问题并不容易,特别是当你混淆所有变量时…但我会尝试回答你的问题.

我认为问题隐藏在服务器端的套接字ID中. Socket.io在每个socket.id上添加名称空间.所以假设客户端的socket.id是4zIISeXsSvKL6VGyAABe,然后在服务器端它是/#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');
  });

});
点赞