提问者:小点点

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


socket.io1.4.5,node. js 5.x

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

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

因为从直觉上讲,它似乎是一个开箱即用的解决方案,可能不需要像这种流行的解决方案一样使用用户ID或电子邮件为每个用户创建自定义房间。

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

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

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设置为位于父作用域连接中,以避免在用户和套接字之间创建映射的需要,因为据推测,这应该是完全使用房间解决方案的优势。

现在我还没有看到任何人这样做,所以我不知道我是否完全朝着默认房间的方向前进,或者出于某种原因,这在野外不能很好地扩展或工作。

问题:

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


共1个答案

匿名用户

理解你真正的问题并不容易,尤其是当你把所有变量都混在一起的时候……但我会试着回答你的问题。

我认为问题隐藏在服务器端的套接字ID中。Socket.io在每个socket.id之前添加命名空间。所以假设您的socket.id在客户端是4zIISeXsSvKL6VGyABe,然后在服务器端是/#4zIISeXsSvKL6VGyABe

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

});