node.js - socket.io 1.0.0^ : Using the default room vs a custom room for user specific communications

标签 node.js sockets socket.io socket.io-1.0

socket.io 1.4.5 , node.js 5.x

转发:在这篇文章之前进行了大量的阅读、努力和失败 - 所以我希望它能帮助很多 future 的读者。


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

因为直觉上,它似乎是一个开箱即用的解决方案 应该反对使用他们的每个用户创建自定义房间的需要 用户 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 内以避免在用户和套接字之间创建映射的需要,因为据推测这是使用的优势房间解决方案。

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

问题:

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

最佳答案

理解您的真正问题并不容易,尤其是当您混淆所有变量时...但我会尽力回答您的问题。

我认为问题隐藏在服务器端的套接字 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');
  });

});

关于node.js - socket.io 1.0.0^ : Using the default room vs a custom room for user specific communications,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35304622/

相关文章:

node.js - puppeteer如何获取元素tagName

javascript - 当我使用 "require"时,Webstorm 无法识别我的全局函数

c - 如何在C中获取套接字的地址ip

python - Node.js 的 python 子脚本在完成时输出,不是实时的

node.js - Node.js +express +socket.io +pm2 能否完全替代 Nginx 处理大并发请求?

node.js - "Info - socket.io started"缺失

javascript - 如何将焦点设置到下一个输入上的输入键按下 react js与refs

javascript - 重新启动浏览器后,angular ngCookies 不保存 cookie

PHP 打印到远程打印机

c++ - C++中的客户端/服务器程序问题