【问题标题】:Close TCP connection after a minute of inactivity一分钟不活动后关闭 TCP 连接
【发布时间】:2021-06-29 15:10:29
【问题描述】:

我有一个服务器,每次客户端连接到它时都会创建一个新线程(客户端处理程序)。如果客户端处理程序在一分钟内没有收到来自客户端的DataInputstream 消息,我希望客户端处理程序关闭连接。

我试过了:

if (System.currentTimeMillis() > startTime + 60000) {
    System.out.println("Time up!!! for client: "+this.socket);
    dos.writeUTF("close");
    this.socket.close
    break;
}

但是,这只会在客户端发送消息后到达 if 语句,并且我想在客户端不活动 1 分钟后自动关闭连接。

【问题讨论】:

  • 这段代码什么时候执行?之后呢?

标签: java tcp network-programming


【解决方案1】:

有多种情况:

  1. 最后一次读取后的超时时间应该是60秒:只需设置read()超时时间:socket.setSoTimeout(60*1000);所以如果读取线程一分钟没有收到任何数据,read()请求就会失败。相应地处理该异常,就可以了。
  2. 总连接超时应为 60 秒,但输入仍以阻塞模式完成:与 (1) 相同,但每次成功读取后,您会减少给定超时:socket.setSoTimeout(msLeft);
  3. 总连接超时应为 60 秒,但输入可以在非阻塞模式下完成:这与您在示例中使用的类非常不同,但这里有一个很好的指南:Non-blocking sockets .

但是,如果可能的话,我会坚持阻塞 I/O,出于很多原因,这样做会更好。

【讨论】:

  • 那么,对于场景 1,如何通知客户端连接已终止?
  • 当客户端当前正在等待 read() 完成时,当服务器关闭连接时 read() 将失败。这是最简单的方法。如果您自己定义协议,另一种方法是发送断开连接消息。
猜你喜欢
  • 1970-01-01
  • 2021-03-19
  • 2013-09-26
  • 2022-12-16
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 2017-04-25
相关资源
最近更新 更多