2013-10-30 73 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: ..., 
}); 
相關問題