Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Socket.IO中的套接字引用_Node.js_Socket.io - Fatal编程技术网

Node.js Socket.IO中的套接字引用

Node.js Socket.IO中的套接字引用,node.js,socket.io,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;

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

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

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

我猜我在这里做错了什么,或者对概念有错误的理解。我怎样才能解决这个问题

编辑:


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

你能试着将心跳间隔设置为

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

最新的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来实现


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

我认为这对我没有帮助。我试过了,什么也没变。谢谢你的建议。你正在使用哪个版本的socket.io?假设它是V0.9.1。此版本更改了服务器端的心跳超时和间隔默认值(60秒和25秒),并实现了客户端心跳检查。很抱歉我在前面的评论中遗漏了另一个场景。它应该读取io.set('心跳间隔',20);io.set('心跳超时',60);默认情况下,客户端超时与服务器端轮询间隔相同(此处为25秒)。消息通过internet(甚至本地主机)需要时间,典型的延迟约为5秒。所以这个设置应该可以解决这个问题。我已经编辑了我的问题。我面临的问题是因为我使用socket.id作为引用,在重新连接后,它似乎会发生变化。这就是为什么我建议不要使用它。对于每个客户端,定义并设置您自己的ID,并使用聊天室来维护私人消息。根据我的经验,您应该使用Redistore来使用“聊天室”功能。因为Socket.io使用Redis的订阅、取消订阅功能来实现“Room”,我厌倦了@freakish,它也不工作了。它的行为就像我的原始代码一样…我按照anand的建议更改了设置,它似乎工作了。但我不知道这样做是否正确。@josnidhin你说它不工作是什么意思?它必须工作!你一定做错了什么事当客户端连接时,他必须向服务器发送他的名字。服务器存储名称并运行
sock.join('/priv/'+name)。它必须起作用,不可能不起作用。:)