1

我有一个连接到套接字服务器(node.js)的客户端。我似乎正在泄漏套接字。

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

  1. 连接到套接字服务器
  2. 注销(我在服务器上看到注销确认)
  3. 再次登录到套接字服务器(参见套接字服务器上的确认)
  4. 快速重启套接字服务器(通过重新保存文件使用主管模块强制重启)
  5. 客户端重新连接到套接字服务器。我现在看到 2 个连接到套接字服务器的套接字,而不是应该只有一个。

如果我重复步骤 2-4,我可以看到来自同一个客户端的多个连接。

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

客户端.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_socketdisconnected事件内部调用(而不仅仅是在客户端选择注销时从其他地方调用),我似乎得到更少的泄漏套接字,但仍然得到它们。

我如何创建多个套接字?

4

1 回答 1

0

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

但是,这意味着一旦我已经建立了连接,如果套接字服务器关闭,则不会尝试重新连接。所以,如果使用这种方法来解决泄漏的套接字,我必须自己处理这种情况。

于 2014-08-11T14:43:59.033 回答