漏电插座(sockets.io)

时间:2014-08-11 12:25:39

标签: node.js socket.io socket.io-1.0

我有一个连接到套接字服务器(node.js)的客户端。我好像在泄漏插座。

这是导致泄漏套接字的流程。

  1. 连接到套接字服务器
  2. 注销(我在服务器上看到注销确认)
  3. 再次登录套接字服务器(请参阅套接字服务器上的确认)
  4. 快速重启套接字服务器(通过重新保存文件强制使用管理模块重启)
  5. 客户端重新连接到套接字服务器。我现在看到已经连接到套接字服务器的2个套接字,而不是应该只有一个。
  6. 如果我重复步骤2-4,我可以看到来自同一客户端的多个连接。

    这是我的客户端socket.io代码:

    client.js:

    function start_socket(tok){
        console.log("socket trying to connect");
        //try every second to reconnect        
        socket = io.connect(sockets_host, { query: $.param({token: tok}), 'forceNew' : true, 'reconnection limit' : 100, 'max reconnection attempts' : 'Infinity' });
    
        socket.on('connect', function() {
                console.log('connected to socket server');
                set_loggedin_status('true');
        });
        socket.on('disconnect', function() {
                console.log('disconnected from server');
                set_loggedin_status('false');
                close_socket(); //get leaked sockets, wether I call this or not, though less if I do...
        });
        socket.on('error',function(err){
                console.log('socket error: ' + err);
                attempt_login();
        });
    }
    
    function close_socket(){
        console.log("in close socket");
        socket.disconnect(true);
        set_loggedin_status('false');
    }
    

    我在没有'forceNew' : true,的情况下尝试了上述操作,但在客户退出后我似乎再次登录时遇到了问题。

    如果我在close_socket事件中调用disconnected(而不仅仅是在客户选择注销时从其他地方调用),我似乎得到的泄漏套接字更少,但仍然可以获得它们。

    我如何创建多个套接字?

1 个答案:

答案 0 :(得分:0)

解决方案虽然不一定是问题的答案,但在我的情况下使用socket.io.disconnect()代替socket.disconnect()

但是,这意味着如果套接字服务器在我已建立连接后关闭,则表示没有尝试重新连接。因此,如果使用这种方法来解决泄漏的套接字,我必须自己处理这种情况。