Nodejs: conseguir que el socket del cliente vuelva a intentarlo después de 5 segundos.

Simplemente comenzando en la progtwigción de node.js y escribiendo un cliente de socket TCP.

Quiero que el cliente se conecte a un servidor. Si el servidor no está disponible (es decir, el servidor no existe en un puerto acordado), quiero que el cliente se agote y se vuelva a conectar después del tiempo de espera.

Tengo este código pero se cuelga en el segundo client.connect. Que pasa

var net = require('net'); var HOST = '127.0.0.1'; var PORT = 9000; var client = new net.Socket(); client.connect(PORT, HOST, function(){ console.log('CONNECTED TO: ' + HOST + ':' + PORT); client.write('I am Superman!'); }); client.on('error', function(e) { while (e.code == 'ECONNREFUSED') { console.log('Is the server running at ' + PORT + '?');` socket.setTimeout(1000, function() { console.log('Timeout for 5 seconds before trying port:' + PORT + ' again'); } client.connect(PORT, HOST, function(){ console.log('CONNECTED TO: ' + HOST + ':' + PORT); client.write('I am the inner superman'); }); }); }); 

Código actualizado:

 var net = require('net'); var HOST = '127.0.0.1'; var PORT = 9000; var client = new net.Socket(); client.connect(PORT, HOST, function(){ console.log('CONNECTED TO: ' + HOST + ':' + PORT); client.write('I am Superman'); }); client.on('error', function(e) { while (e.code == 'ECONNREFUSED') { console.log('Is the server running at ' + PORT + '?'); client.setTimeout(4000, function() { client.connect(PORT, HOST, function() { console.log('CONNECTED TO: ' + HOST + ':' + PORT); client.write('I am inner Superman'); }); console.log('Timeout for 5 seconds before trying port:' + PORT + ' again'); }); } }); client.on('data', function(data) { console.log('DATA: ' + data); client.destroy(); }); client.on('close', function() { console.log('Connection closed'); }); 

Con el código actualizado, el tiempo de espera no parece tener efecto. Cuando inicio este cliente sin un servidor correspondiente, el resultado se muestra a continuación con una espera de 4 segundos.

 Is the server running at 9000? Is the server running at 9000? Is the server running at 9000? Is the server running at 9000? … 

Actualizar (¿ladrando el árbol equivocado?)

Volví a mirar el evento socket.on (‘error’) y vi que se llama al evento close inmediatamente después del error. Por lo tanto, el código cerrará el tcpclient sin esperar 4 segundos. ¿Alguna idea mejor?

Su tiempo de espera se invierte.

Debe verse como

 var net = require('net'); var HOST = '127.0.0.1'; var PORT = 9000; var client = new net.Socket(); client.connect(PORT, HOST, function(){ console.log('CONNECTED TO: ' + HOST + ':' + PORT); client.write('I am Superman!'); }); client.on('error', function(e) { if(e.code == 'ECONNREFUSED') { console.log('Is the server running at ' + PORT + '?'); client.setTimeout(4000, function() { client.connect(PORT, HOST, function(){ console.log('CONNECTED TO: ' + HOST + ':' + PORT); client.write('I am the inner superman'); }); }); console.log('Timeout for 5 seconds before trying port:' + PORT + ' again'); } }); client.on('data', function(data) { console.log('DATA: ' + data); client.destroy(); }); client.on('close', function() { console.log('Connection closed'); }); 

La función que desea ejecutar después del tiempo de espera es la callback. Ese es el que espera su ejecución.

Además, cambie su while a if , esa condición no cambiará durante un solo evento de error. Y tus parens y paréntesis no coinciden.

.connect mi comentario sobre la respuesta aceptada, descubrí un problema al utilizar la .connect llamada .connect frente al oyente 'connect' . Cada vez que llama, conéctese a la llamada de retorno (agrega un escucha) aunque la conexión falle. Así que cuando finalmente se conecta todos esos callbacks se llaman. Entonces, si usa .once('connect'.. lugar, eso no sucederá. A continuación se presentan las declaraciones de registro del código de cliente de mi proyecto que me llevaron a esta observación.

 ENOENT timeout ENOENT timeout ENOENT timeout ENOENT timeout ENOENT timeout ENOENT timeout ENOENT timeout ENOENT timeout ENOENT timeout (node:21061) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 connect listeners added. Use emitter.setMaxListeners() to increase limit ^=== if you timeout and try .connect again eventually you hit this limit ENOENT timeout <==== here is where the connection finally happens connecting <==== now all those listener callbacks fire. connecting connecting connecting connecting connecting connecting connecting connecting connecting connecting 

así que prueba esta versión a continuación

 const net = require('net') const HOST = '127.0.0.1' const PORT = 9000 const client = new net.Socket() const connect = () => {client.connect(PORT, HOST)} client.once('connect', function(){ console.log('CONNECTED TO: ' + HOST + ':' + PORT) client.write('I am Superman!') }) client.on('error', function(e) { if(e.code == 'ECONNREFUSED') { console.log('Is the server running at ' + PORT + '?') console.log('Waiting for 5 seconds before trying port:' + PORT + ' again') setTimeout(connect,5000) } }) connect() client.on('data', function(data) { console.log('DATA: ' + data) client.destroy() }) client.on('close', function() { console.log('Connection closed') })