一分钟不活动后关闭 TCP 连接
Close TCP connection after a minute of inactivity
我有一个服务器,每次客户端连接到它时都会创建一个新线程(客户端处理程序)。如果客户端处理程序在一分钟内未收到来自客户端的 DataInputstream
消息,我希望客户端处理程序关闭连接。
我试过:
if (System.currentTimeMillis() > startTime + 60000) {
System.out.println("Time up!!! for client: "+this.socket);
dos.writeUTF("close");
this.socket.close
break;
}
但是,这只会在客户端发送消息后到达 if 语句,我想在客户端不活动 1 分钟后自动关闭连接。
有多种情况:
- 最后一次读取后的超时应该是 60 秒:只需设置 read() 超时:
socket.setSoTimeout(60*1000);
所以如果读取线程在一分钟内没有收到任何数据,read() 请求将失败.相应地处理该异常,您就知道了。
- 总连接超时应为 60 秒,但输入仍以阻塞模式完成:与 (1) 相同,但在每次成功读取后减少给定超时:
socket.setSoTimeout(msLeft);
- 总连接超时应为 60 秒,但输入可以在非阻塞模式下完成:这与您在示例中使用的 类 非常不同,但这是一个很好的指南对此:Non-blocking sockets.
但是,如果可能的话,我会坚持阻止 I/O,出于很多原因,它只是更好。
我有一个服务器,每次客户端连接到它时都会创建一个新线程(客户端处理程序)。如果客户端处理程序在一分钟内未收到来自客户端的 DataInputstream
消息,我希望客户端处理程序关闭连接。
我试过:
if (System.currentTimeMillis() > startTime + 60000) {
System.out.println("Time up!!! for client: "+this.socket);
dos.writeUTF("close");
this.socket.close
break;
}
但是,这只会在客户端发送消息后到达 if 语句,我想在客户端不活动 1 分钟后自动关闭连接。
有多种情况:
- 最后一次读取后的超时应该是 60 秒:只需设置 read() 超时:
socket.setSoTimeout(60*1000);
所以如果读取线程在一分钟内没有收到任何数据,read() 请求将失败.相应地处理该异常,您就知道了。 - 总连接超时应为 60 秒,但输入仍以阻塞模式完成:与 (1) 相同,但在每次成功读取后减少给定超时:
socket.setSoTimeout(msLeft);
- 总连接超时应为 60 秒,但输入可以在非阻塞模式下完成:这与您在示例中使用的 类 非常不同,但这是一个很好的指南对此:Non-blocking sockets.
但是,如果可能的话,我会坚持阻止 I/O,出于很多原因,它只是更好。