Socket.IO 中的套接字引用

Jos*_*hin 0 node.js socket.io

我是 nodejs 的新手,正在试验 socket.io。我正在尝试向特定的套接字发送消息,所以我想我会存储对套接字的引用。

var controls = {};
var clients = {};

var control = io
  .of("/control")
  .on("connection", function(socket){
    socket.on("connect_player", function(data){
      var id = data.screen_id;
      controls[socket.id] = id;
    });

    socket.on("msg", function(data){
      id = controls[socket.id]
      player.socket(clients[id]).emit("msg", data);
    });
  });

var player = io
  .of("/player")
  .on("connection", function(socket){
    socket.on("set_id", function(id){
      clients[id] = socket.id
    });
  });
Run Code Online (Sandbox Code Playgroud)

我首先启动一个连接到“播放器”命名空间并显示一个 id(硬编码)的网页。然后另一个网页连接到与播放器具有相同 id 的“控制”命名空间,现在控制器应该能够向该特定播放器发送消息,但这会工作一段时间然后失败。

在它工作期间,我可以将消息从控制页面发送到特定的播放器页面。

在播放器停止工作后,我查看了播放器命名空间中的套接字 ID,发现套接字 ID 与初始 ID 不同。

我想我在这里做错了什么或者对概念有错误的理解。我该如何解决这个问题。

编辑:

我为“重新连接”事件添加了侦听器,发现 socket.id 的值在每个“重新连接”事件之后都会发生变化。因此控件和客户端具有无效的 socket.id 值,这导致了我的问题。有没有办法克服这个。

fre*_*ish 6

最新的 socket.io 支持房间。那么这个怎么样?对于每个连接,为此连接设置一个唯一的 ID(例如唯一的用户名 - 这与 session 一起使用非常好 - 或者任何你想要的)。然后你可以使用

io.on('connection', function(socket) {
   // retrieve the ID from socket
   socket.join('/priv/'+ID);
});
Run Code Online (Sandbox Code Playgroud)

然后您可以在msg处理程序中执行以下操作:

// get the ID
io.sockets.in('/priv/'+ID).emit("msg", data);
Run Code Online (Sandbox Code Playgroud)

此时,您可以确定消息已发送给您想要的用户。当然,您需要确保客户端重新连接时 ID 不会更改。就像我之前提到的 - 这可以通过将会话 cookie 发送到服务器并从会话中检索 ID 来完成。

而且我认为这是唯一可接受的解决方案,因为客户端可能会重新连接多次,并且您希望其他客户端通过例如(唯一)名称来识别该特定客户端。