所以我在这个帖子How do I shutdown a Node.js http(s) server immediately?中修改了接受的答案,并且能够关闭我的nodejs服务器。
// Create a new server on port 4000
var http = require('http');
var server = http.createServer(function (req, res) { res.end('Hello world!'); }).listen(4000);
// Maintain a hash of all connected sockets
var sockets = {}, nextSocketId = 0;
server.on('connection', function (socket) {
// Add a newly connected socket
var socketId = nextSocketId++;
sockets[socketId] = socket;
console.log('socket', socketId, 'opened');
// Remove the socket when it closes
socket.on('close', function () {
console.log('socket', socketId, 'closed');
delete sockets[socketId];
});
});
...
when (bw == 0) /*condition to trigger closing the server*/{
// Close the server
server.close(function () { console.log('Server closed!'); });
// Destroy all open sockets
for (var socketId in sockets) {
console.log('socket', socketId, 'destroyed');
sockets[socketId].destroy();
}
}
但是,在客户端,由于server.close()语句,客户端抛出ConnectionException。我希望客户端抛出一个SocketTimeoutException,这意味着服务器处于活动状态,但套接字只是挂起。其他人能够使用Java的jetty服务器来完成这项工作
Server jettyServer = new Server(4000);
...
when (bw == 0) {
server.getConnectors()[0].stop();
}
有可能实现这样的目标吗?我已经坚持了一段时间,任何帮助都非常感激。感谢。
答案 0 :(得分:0)
你问的是不可能的。从未终止但在超时期间未提供任何数据的连接中读取时会引发SocketTimeoutException
。
连接关闭不会导致它。它也不会导致ConnectionException
,因为没有这样的东西。它导致EOFException
,从readLine()
返回空值,从read()
返回-1,或者如果关闭是中止则返回IOException: connection reset
。
你的问题没有意义。