首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >重新连接net.socket nodejs

重新连接net.socket nodejs
EN

Stack Overflow用户
提问于 2014-09-11 23:27:31
回答 6查看 22.6K关注 0票数 7

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

我的想法是将连接序列包装到一个函数中,然后在“close”事件上尝试重新连接。显然没那么容易。

代码语言:javascript
复制
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);
});

因此,当远程主机关闭时,我看到我的日志开始通过,然而,似乎正在发生的事情是,一旦远程主机上线,所有以前的尝试都开始处理-如果这有意义的话。如果您查看client.connect,就会发现有一个名为startSequence的函数,它发送一些数据来“启动”来自远程服务器端的连接。当服务器离线,我开始重新连接时,所有以前失败的尝试似乎都已被缓冲,并在服务器联机时一起发送。

我也尝试了这个Stackoverflow链接中的代码,但都没有用(Nodejs - getting client socket to try again after 5 sec time out)

代码语言:javascript
复制
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();
        })
    })
});

对于如何在失败后重新连接套接字,有什么建议吗?

EN

回答 6

Stack Overflow用户

发布于 2017-06-13 00:04:09

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

代码语言:javascript
复制
/* 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()
票数 11
EN

Stack Overflow用户

发布于 2015-05-06 22:27:38

我的解决方案是:

代码语言:javascript
复制
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);
    });
  }

如有必要,请连接:

代码语言:javascript
复制
  if (!S(parentHOST).isEmpty() && !S(parentPORT).isEmpty()) {
    startParentClient();
  }
票数 4
EN

Stack Overflow用户

发布于 2015-08-26 07:24:30

我使用以下代码来实现与node.js的重新连接。我不是Javascript专家,所以我猜它可以改进,但它对我来说仍然很好。我希望这能有所帮助。最好的。

代码语言:javascript
复制
//----------------------------------------------------------------//
// SocketClient                                                   //
//----------------------------------------------------------------//
var net = require('net');

var SocketClient = function(host, port, data_handler, attempt)
{
    var node_client;
    var attempt_index = (attempt ? attempt : 1);

    this.m_node_client = new net.Socket();
    node_client = this.m_node_client;
    this.m_node_client.on('close', function()
    {
        var new_wrapper = new SocketClient(host, port, data_handler, attempt_index + 1);

        node_client.destroy();
        new_wrapper.start();
    });
    this.m_node_client.on('data', data_handler);
    this.m_node_client.on('error', function(data)
    {
        console.log("Error");
    });
    this.start = function()
    {
        this.m_node_client.connect(port, host, function()
        {
            console.log('Connected ' + attempt_index);
        });
    };
};

//----------------------------------------------------------------//
// Test                                                           //
//----------------------------------------------------------------//
var test_handler = function(data)
{
    console.log('TestHandler[' + data + ']');
};
var wrapper = new SocketClient('127.0.0.1', 4000, test_handler);

wrapper.start();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25791436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档