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

Posted

技术标签:

【中文标题】socket.io 1.0.0^:使用默认房间与自定义房间进行用户特定的通信【英文标题】:socket.io 1.0.0^ : Using the default room vs a custom room for user specific communications 【发布时间】:2016-05-20 04:19:40 【问题描述】:

socket.io 1.4.5,node.js 5.x

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


当我考虑如何使用默认房间时,我感到困惑 使用房间进行特定于用户的交流。(如直接消息)

因为直观上看,它似乎是一种开箱即用的解决方案,可能 应该弃用为每个用户创建自定义房间的需要 用户 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 设置在父作用域 connection 内,以避免在用户和套接字之间创建映射,因为这应该是完全使用房间解决方案的优势。

现在我还没有看到有人这样做,所以我不知道我是不是 完全朝着默认房间的方向发展,或者如果 出于某种原因,这在野外无法扩展或运行良好。

问题:

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

【问题讨论】:

【参考方案1】:

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

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

);

【讨论】:

请注意,从 1.5.0 版(以及这个 PR)开始,默认命名空间 (/) 中服务器端的 socket.id 也将是 4zIISeXsSvKL6VGyAABe。跨度>

以上是关于socket.io 1.0.0^:使用默认房间与自定义房间进行用户特定的通信的主要内容,如果未能解决你的问题,请参考以下文章

一次加入多个房间 Socket.io

如何使用集群处理 Socket.IO 房间?

使用Socket.io将消息发送到多个房间?

使用 socket.io 防止向多个房间发送消息

( Socket.io ) 一个socket连接多个房间

使用 socket.io 时如何获取房间内的客户端数量?