我正在使用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
);
};
有人知道代码中的重新连接不起作用,但手动重新连接起作用的原因吗?这是更常见的事情吗?是我(客户端)可以做的事情,还是服务器端的事情?
欢迎所有提示!