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