2012-01-20 15 views
20

decir es creado como un servidor:Cómo detener un servidor node.js sin matar el proceso?

var net = require('net'); 

var server = net.createServer(); 
server.listen(32323, '127.0.0.1'); 

server.close(); // gives a "not running" error if there is IP in the listen statement 

hay una manera para que deje de Node.js, por ejemplo sin terminar/matar todo el proceso?

Además, aquí hay un ejemplo más complicado que no se detiene, independientemente de la dirección IP del servidor está obligado a:

var net = require('net'); 

var server = net.createServer(function(socket) { 
    socket.on('data', console.log); 
    server.close(); 
}); 

server.listen(32323); 

var socket = net.createConnection(32323); 
socket.write('hi'); 

Respuesta

20

server.close

no llame a cerrar antes de "listening" desencadena el evento.

O añadir una devolución de listen o añadir un evento manualmente

server.listen(port, host, function() { server.close(); }); 
// OR 
server.on("listening", function() { server.close(); }); 
server.listen(port, host); 

var net = require('net'); 

var server = net.createServer(function(socket) { 
    socket.on('data', console.log); 
    server.close(); 
}); 

server.listen(32323); 

var socket = net.createConnection(32323); 
// call end to make sure the socket closes 
socket.end('hi'); 
+0

extraño, la anterior vez que han intentado esto me dio un error – Fluffy

+0

Hey, me estoy haciendo eso de nuevo, por favor ver la actualización – Fluffy

+0

@Fluffy ver editar – Raynos

3

Saltar a la segunda, el caso más realista: cerrar la conexión actual antes de llamar server.close:

var net = require('net') 

var server = net.createServer(function(socket){ 
    socket.on('data', function(data){ 
     console.log(data.toString()) 
     socket.destroy() 
     server.close() 
    }) 
}) 

server.listen(32323) 

Tenga en cuenta que si no tiene ninguna otra instancia de servidor o actividad en proceso, se cerrará después de cerrar server.

2

Si se trata de un servidor HTTP o HTTPS, ayuda si se cierra el socket de la solicitud con la siguiente:

function onRequest(request, response) { 
    response.end(); //close the response 
    request.connection.end(); //close the socket 
    request.connection.destroy; //close it really 
    server.close(); //close the server 
} 

server.on("request", onRequest); 
server.on("close", function() {console.log("closed");}); 

server.listen(port, host); 

Espero que ayude.

0

Aquí hay un ejemplo que demuestra lo que creo que estás buscando.

var net = require('net'); 


var server = net.createServer(function (socket) { 
    socket.on('data', function (data) { 
    console.log("server got data " + data.toString()); 

    }); 
}); 

function startServer() { 
    server.listen(32323, function() { 
    console.log('server started'); 
    }); 
} 

function stopServer() { 
    server.close(function() { 
    console.log('server stopped'); 
    }); 
} 

setInterval(function() { 

    if (server.address()) { 
    console.log("Server is running on port " + server.address().port + " let's kill it."); 
    stopServer(); 
    } else { 
    console.log("Server is stopped let's start it."); 
    startServer(); 
    } 

}, 10000); 


setInterval(function() { 

    var socket = net.createConnection(32323, function() { 
    socket.write('hi'); 
    }); 
    socket.on('error', function (e) { 
    console.log(e.message); 
    }); 


}, 1000); 

startServer(); 
0

server.close() impide nuevas conexiones y espera hasta que todos los clientes están cerrados.

Para matar a la fuerza un servidor de nodos, debe llamar a server.close() y luego cerrar todas las conexiones abiertas desde el extremo del servidor.

Cuando un cliente se conecta, realice un seguimiento del zócalo.

var sockets = [] 

var server = net.createServer((socket) => { 
    sockets.push(socket) 
}) 

Para matar a la fuerza ...

server.close() 
sockets.forEach((s) => s.end()) 
Cuestiones relacionadas