Socket.IO中的套接字引用

时间:2012-03-12 05:27:51

标签: 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
    });
  });

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

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

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

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

编辑:

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

2 个答案:

答案 0 :(得分:4)

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

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

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

// get the ID
io.sockets.in('/priv/'+ID).emit("msg", data);

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

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

答案 1 :(得分:1)

您可以尝试将心跳间隔设置为

 io.set('heartbeat interval', 20); 
 io.set('heartbeat timeout', 60);