2013-10-30 9 views
12

In Node.js verwende ich websockets/ws für eine WebSocket-Verbindung. Unten ist der Code für den Client. Nehmen wir an, der Server-Socket, mit dem wir uns verbinden, geht für eine Minute nach unten. Das close-Ereignis wird ausgelöst, aber was ist der beste Weg, um die Verbindung zum Socket wiederherzustellen, wenn der Socket auf dem Server ausfällt oder Fehler auftreten?NodeJS WebSocket, wie neu zu verbinden, wenn Server neu startet

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? 
}); 

Antwort

12

Ich habe https://github.com/joewalnes/reconnecting-websocket/blob/master/reconnecting-websocket.js mit Erfolg verwendet.

sollten Sie in der Lage sein zu tun:

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

Interessant. Ich werde mich darum kümmern, aber ich würde lieber einaros ws verwenden. – wwwuser

+1

Es ist eine clientseitige Lib. Sie können die Einaros-Bibliothek weiterhin auf dem Server verwenden. –

+0

Ups, ich sehe, was vor sich geht. Du verbindest dich mit einem Websocket von node.js. Dies kann immer noch helfen. Sie können damit den einaros WebSocket umbrechen. –

26

Try this:

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(); 

Sie erhalten die ursprüngliche Implementierung zu verwenden, ohne es wickeln zu müssen.

+4

Schließen wird immer nach einem Fehler aufgerufen. Dies ruft bei einem Fehler eine Verbindung zweimal auf. –

+0

@DustinGraham Sie sind absolut richtig. Wäre es da seit dem Rückruf für den Fehler einfach zu entfernen? Fühlen Sie sich frei, die Antwort selbst zu bearbeiten, wenn ich nicht sofort antworten werde. –

Verwandte Themen