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,现在控制器应该能够发送消息到特定的播放器,但这个工作一段时间,然后失败。

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

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

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

编辑:

我添加了“reconnect”事件监听器,并发现每个“reconnect”事件后,socket.id的值都会发生变化。 所以控件和客户端都有无效的socket.id值来解决我的问题。 有没有要克服这一点。

最新的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来完成。

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

你可以尝试设置心跳间隔为

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