恒定的ETIMEDOUT,但是手动重新连接可以再次工作吗? (很奇怪。)

时间:2018-08-08 17:02:23

标签: javascript node.js websocket timeout connection

我正在使用Nodejs v10.8.0上的node ws websocket library连接到远程websocket api。连接非常忙(每秒有很多消息),尽管它仍在工作中,但它将处理财务数据,并且保持连接状态非常重要。

起初连接相当稳定,但几个小时后它通常会停顿,仅提供

Error: connect ETIMEDOUT 149.202.xxx.xx:443

我有后备代码(包括ping / pong机制)来捕获断开连接并重新连接。这对于我得到的其他各种断开连接都很好,但是对于此错误却不行。收到此错误后,每次重新连接都将在同一个ETIMEDOUT中结束,并且可能会持续几个小时。但是,如果我手动停止脚本(使用Ctrl+C结束),然后立即再次运行它,它将连接并再次正常运行。

这是我用来重新连接的一些代码(该机器人称为Marie):

Marie.prototype.open = function() {
    this.ws = new WebSocket(this.url);
    this.rest = new RestClient(this.key, this.secret);

    this.ws.on('open', () => {
        log('WEBSOCKET OPEN');
        this.init_listeners();
    });
    this.ws.on('error', (error) => {
        log('WEBSOCKET ONERROR: ' + error);
        tools.sendMail('WEBSOCKET ONERROR', JSON.stringify(error));
        this.reconnect();
    });
    this.ws.on('close', (event) => {
        log('WEBSOCKET ONCLOSE: ' + event);
        this.reconnect();
    });
};

Marie.prototype.reconnect = function() {
    // Inspiration: https://github.com/websockets/ws/wiki/Websocket-client-implementation-for-auto-reconnect
    log('Reconnecting...');
    let that = this;
    setTimeout(() => {
        that.open();}, 
        100
    );
};

有人知道代码中的重新连接不起作用,但手动重新连接起作用的原因吗?这是更常见的事情吗?是我(客户端)可以做的事情,还是服务器端的事情?

欢迎所有提示!

0 个答案:

没有答案