ブラウザからアクセスすると、同一のTCPコネクションの中で、/
と/favicon.ico
へ、合わせて2回のHTTPリクエストが発生し、対応するコールバックも2回呼ばれる。ところが、1回目のコールバックですでにserver.close()
が実行されているため、次のリクエストでserver.close()
がもう一度実行されたときにエラーが生じる。
var http = require('http');
server = http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
req.socket.end(); // ここでTCPのコネクションを切る
});
server.on('connection', function() {
server.close();
});
server.listen(8080, 0, function () {
console.log('Server running at http://localhost:8080/');
});
はじめは、2回目のリクエスト後にserver.close()
すればよいと考えて以下のコードを書いたのですが、req.socket.end()
を実行しているのにTCPのコネクションが切断されず、keep-aliveの分だけ接続が残ってしまいます。どうしてなのでしょうか……
var http = require('http'),
sockets = {};
server = http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
var key = req.socket.remoteAddress + ':' + req.socket.remotePort;
if (key in sockets) {
server.close();
req.socket.end();
} else {
sockets[key] = true;
}
});
server.listen(8080, 0, function () {
console.log('Server running at http://localhost:8080/');
});
TCPのコネクションは2本張られているにもかかわらず、実際にHTTPのやりとりをしているのはその片方だけだったようです(serverの
connection
イベントは2回実行されました)。req.socket.end()
を実行しても、もう片方のTCPコネクションが残っており、すぐにサーバが落ちない、というのが原因のようです。furukawaさんコメントありがとうございました。