2015-01-17 5 views
7

Non sono riuscito a trovare una risposta chiara su Google o SO.Come chiudere correttamente un server TCP Node.js?

Conosco un'istanza net.Server con un metodo close che non consente l'ingresso di altri client. Ma non disconnette i client già connessi. Come posso ottenerlo?

So come si può fare con Http, suppongo che sto chiedendo se è lo stesso con Tcp o se è diverso.

con HTTP, mi piacerebbe fare qualcosa di simile:

var http = require("http"); 

var clients = []; 

var server = http.createServer(function(request, response) { 
    response.writeHead(200, {"Content-Type": "text/plain"}); 
    response.end("You sent a request."); 
}); 

server.on("connection", function(socket) { 
    socket.write("You connected."); 
    clients.push(socket); 
}); 

// .. later when I want to close 
server.close(); 
clients.forEach(function(client) { 
    client.destroy(); 
}); 

E 'lo stesso per il protocollo TCP? O dovrei fare qualcosa di diverso?

+0

sì, lo stesso. Mantieni la lista dei client collegati e chiudi tutti attivi prima di fare 'server.close()' se hai bisogno di un arresto forzato (ma se è davvero "difficile" fai semplicemente 'process.exit()' potrebbe essere meglio) –

+1

Non dimenticare di rimuovi i socket quando si disconnettono (ad es. l'evento 'close' del socket), altrimenti finirai con un array di socket sempre crescente contenente socket potenzialmente morti. – mscdex

risposta

6

Dal momento che nessuna risposta è stata fornita, qui è un esempio di come aprire e (duro) chiudere un server in node.js:

creare il server:

var net = require('net'); 

var clients = []; 
var server = net.createServer(); 

server.on('connection', function (socket) { 
    clients.push(socket); 
    console.log('client connect, count: ', clients.length); 

    socket.on('close', function() { 
     clients.splice(clients.indexOf(socket), 1); 
    }); 
}); 

server.listen(8194); 

Chiudere il server:

// destroy all clients (this will emit the 'close' event above) 
for (var i in clients) { 
    clients[i].destroy(); 
} 
server.close(function() { 
    console.log('server closed.'); 
    server.unref(); 
}); 

Aggiornamento: Dato che utilizzando il codice di cui sopra, ho incontrato un problema che close lascerà la porta aperta (TIM E_WAIT in Windows). Dal momento che sto chiudendo intenzionalmente la connessione, sto usando unref come sembra chiudere completamente il server TCP, anche se non sono al 100% se questo è il modo corretto di chiudere la connessione.