Подтвердить что ты не робот

Как остановить сервер node.js, не убивая процесс?

Предположим, что сервер создан как:

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

есть способ остановить его от node.js, например. без завершения/уничтожения всего процесса?

Кроме того, здесь более сложный пример, который не останавливается независимо от IP-адреса, на который привязан сервер:

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');
4b9b3361

Ответ 1

server.close

Не запускайте вызов перед тем, как срабатывает событие "listening".

Либо добавьте обратный вызов к listen, либо добавьте событие вручную

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

Ответ 2

Переход к второму, более реалистичному случаю: закрыть текущее соединение перед вызовом 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)

Обратите внимание, что если у вас нет других экземпляров сервера или активности в этом процессе, он прекратит работу после закрытия server.

Ответ 3

Если это HTTP или HTTPS-сервер, это помогает, если вы закроете сокет запроса со следующим:

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

Надеюсь, что это поможет.

Ответ 4

Вот пример, демонстрирующий, что я думаю, что вы после.

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 kill it.");
    stopServer();
  } else {
    console.log("Server is stopped let 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();

Ответ 5

server.close() предотвращает новые подключения и ждет, пока все клиенты не будут закрыты.

Чтобы принудительно убить сервер node, вам нужно вызвать server.close(), а затем закрыть все открытые соединения с конца сервера.

Когда клиент подключается, отслеживайте сокет.

var sockets = []

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

Чтобы принудительно убить...

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