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

socket.io 1.4.5,node.js 5.x

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


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

因为直觉上,这看起来就像一个开箱即用的解决scheme,可能不应该像使用这种stream行的解决scheme一样,使用他们的用户ID或电子邮件为每个用户创build一个自定义房间。

而且,由于它是自动创build的,我认为它应该是我的唯一唯一的独立侦听器。

这导致我的尽职调查来创build这个解决scheme:

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内部生存,以避免需要在用户和套接字之间创build映射,因为据推测这应该是使用房间解决scheme的优势。

现在我还没有看到有人这样做,所以我不知道是否完全按照默认房间的方向进行,或者由于某些原因,这样做不能扩展或在野外工作。

题:

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

理解你真正的问题并不容易,特别是当你混淆了所有的variables…但我会尽力回答你的问题。

我认为问题隐藏在服务器端的套接字标识符。 Socket.io在每个socket.id上预先命名空间。 假设你的客户端的socket.id4zIISeXsSvKL6VGyAABe ,那么在服务器端是/#4zIISeXsSvKL6VGyAABe

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

我修复它的方式,我连接后更新客户端的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'); }); });