重新连接net.socket nodejs

Rya*_*ock 6 sockets node.js

我是node.js的新手,想要连接到TCP套接字.为此,我使用网络模块.

我的想法是将连接序列包装成一个函数然后在'close'事件上,尝试重新连接.显然不那么容易.

function conn() {

    client.connect(HOST_PORT, HOST_IP, function() {
        startSequence();
    })
}

client.on('close', function(e) {
    log('info','Connection closed! -> ' + e)
    client.destroy();
    setTimeout(conn(),1000);
});
Run Code Online (Sandbox Code Playgroud)

因此,当远程主机关闭时,我会看到我的日志正在通过,然而似乎正在发生的事情是,当远程主机上的安卓在线时所有先前的尝试都开始被处理 - 如果这是有意义的.如果你看一下client.connect,就会有一个名为startSequence的函数,它发送一些从远程服务器端"启动"连接的数据.当服务器脱机并且我开始重新连接之前所有失败的尝试似乎已被缓冲并且在服务器上线时全部一起发送.

我已尝试使用此Stackoverflow链接中的代码也无济于事(Nodejs - 让客户端套接字在5秒后超时再试一次)

client.connect(HOST_PORT, HOST_IP, function() {
    pmsStartSequence();
})


// Add a 'close' event handler for the client socket
client.on('close', function(e) {
    log('debug','connection  closed -> ' + e)
    client.setTimeout(10000, function() {
        log('debug', 'trying to reconnect')
        client.connect(HOST_PORT, HOST_IP, function() {
            pmsStartSequence();
        })
    })
});
Run Code Online (Sandbox Code Playgroud)

有关如何在失败后重新连接套接字的建议吗?

ebk*_*ebk 11

问题在于您设置了on-connect回调.

socket.connect()的文档说:

connectListener ...将作为'connect'事件的监听器添加一次.

通过在socket.connect()调用中设置它,每次尝试重新连接时,都会将另一个调用startSequence()的侦听器(一次性)附加到该套接字.在重新连接成功之前,这些监听器不会被解雇,因此您可以在单个连接上同时触发所有监听器.

一种可能的解决方案是将connect侦听器与socket.connect()调用分开.

client.on('connect', function() {
    pmsStartSequence();
});

client.on('close', function(e) {
    client.setTimeout(10000, function() {
        client.connect(HOST_PORT, HOST_IP);
    })
});

client.connect(HOST_PORT, HOST_IP);
Run Code Online (Sandbox Code Playgroud)


Vin*_*els 10

受其他解决方案的启发,我写了这个,经过测试,它有效!它将继续每 5 秒尝试一次,直到建立连接,如果它也失去连接,则工作。

/* Client connection */
/* --------------------------------------------------------------------------------- */

const client = new net.Socket()
var intervalConnect = false;

function connect() {
    client.connect({
        port: 1338,
        host: '127.0.0.1'
    })
}

function launchIntervalConnect() {
    if(false != intervalConnect) return
    intervalConnect = setInterval(connect, 5000)
}

function clearIntervalConnect() {
    if(false == intervalConnect) return
    clearInterval(intervalConnect)
    intervalConnect = false
}

client.on('connect', () => {
    clearIntervalConnect()
    logger('connected to server', 'TCP')
    client.write('CLIENT connected');
})

client.on('error', (err) => {
    logger(err.code, 'TCP ERROR')
    launchIntervalConnect()
})
client.on('close', launchIntervalConnect)
client.on('end', launchIntervalConnect)

connect()
Run Code Online (Sandbox Code Playgroud)


Rau*_*uez 4

我的解决方案:

var parentHOST = '192.168.2.66';
var parentPORT = 9735;

var net = require('net');
var S = require('string');
var parentClient = new net.Socket();
var parentActive = false;

var startParentClient = function () {
    parentClient = new net.Socket();
    parentActive = false;

    parentClient.connect(parentPORT, parentHOST, function() {
      console.log('Connected ' + cluster.worker.id + ' to parent server: ' + parentHOST + ':' + parentPORT);
      parentActive = true;
    });

    parentClient.on('error', function() {
      parentActive = false;
      console.log('Parent connection error');
    });

    parentClient.on('close', function() {
      parentActive = false;
      console.log('parent connection closed');
      setTimeout(startParentClient(), 4000);
    });
  }
Run Code Online (Sandbox Code Playgroud)

如果需要连接:

  if (!S(parentHOST).isEmpty() && !S(parentPORT).isEmpty()) {
    startParentClient();
  }
Run Code Online (Sandbox Code Playgroud)