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);