使用节点js服务器创建sockettimeoutexception

时间:2016-10-03 23:11:24

标签: node.js sockets server jetty

所以我在这个帖子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();
}

有可能实现这样的目标吗?我已经坚持了一段时间,任何帮助都非常感激。感谢。

1 个答案:

答案 0 :(得分:0)

你问的是不可能的。从未终止但在超时期间未提供任何数据的连接中读取时会引发SocketTimeoutException

连接关闭不会导致它。它也不会导致ConnectionException,因为没有这样的东西。它导致EOFException,从readLine()返回空值,从read()返回-1,或者如果关闭是中止则返回IOException: connection reset

你的问题没有意义。