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