2013-10-30 77 views
12

在Node.js中,我使用websockets/ws进行WebSocket连接。以下是客户端的代码。假设我们正在连接的服务器套接字关闭一分钟。关闭事件会触发,但是当服务器上的套接字发生故障或错误时,重新连接套接字的最佳方式是什么?NodeJS Websocket当服务器重新启动时如何重新连接

var ws = new WebSocket('ws://localhost'); 

ws.on('open', function() { 
    console.log('socket open'); 
}); 
ws.on('error', function() { 
    console.log('socket error'); 
    // how do I reconnect to the ws after x minutes here? 
}); 
ws.on('close', function() { 
    console.log('socket close'); 
    // how do I reconnect to the ws after x minutes here? 
}); 

回答

12

我已使用https://github.com/joewalnes/reconnecting-websocket/blob/master/reconnecting-websocket.js成功。

你应该能够做到:

ws = new ReconnectingWebSocket('ws://....'); 
ws.reconnectInterval = 60000; // try to reconnect after 10 seconds 
+1

有趣。我会研究它,但我更喜欢使用einaros的ws。 – wwwuser

+1

这是一个客户端库。您仍然可以在服务器上使用einaros库。 –

+0

哎呀,我明白发生了什么事。您正在通过node.js连接到websocket。这仍然可能有所帮助。你可以用它来包装einaros WebSocket。 –

26

试试这个:

var reconnectInterval = x * 1000 * 60; 
var ws; 
var connect = function(){ 
    ws = new WebSocket('ws://localhost'); 
    ws.on('open', function() { 
     console.log('socket open'); 
    }); 
    ws.on('error', function() { 
     console.log('socket error'); 
    }); 
    ws.on('close', function() { 
     console.log('socket close'); 
     setTimeout(connect, reconnectInterval); 
    }); 
}; 
connect(); 

你得到使用原来的实现,而不必把它包起来。

+4

关闭总是在错误后被调用。这会在出现错误时调用连接两次。 –

+0

@DustinGraham你是绝对正确的。这是否会使简单地删除错误的回调?如果我没有及时回复,请随时自行编辑答案。 –

3

2018-JAN更新

重新连接到一个断开网络插座non-trivial, and best delegated to a library。目前为此目的最小和最积极维护的库是reconnecting-websocket,其中obsoletes joewalnes's library来自其他答案。具体来说,对于Node.js,您需要传递一个构造函数,如WebSocket:

import WebSocket from 'ws'; 
import ReconnectingWebSocket from 'reconnecting-websocket'; 
const ws = new ReconnectingWebSocket('wss://some-feed.com', [], { 
    constructor: WebSocket, 
    connectionTimeout: ..., // in milliseconds 
    reconnectInterval: ..., 
}); 
相关问题