【问题标题】:java socket timeout behaviourjava套接字超时行为
【发布时间】:2013-02-28 00:57:56
【问题描述】:

如果我在 java 套接字上设置了 soTimeout,那么在主动对等点与被动对等点的情况下会出现什么行为。例如,如果我有一个 readtimeout 值 1 分钟并且有一个文件传输并且需要 5 分钟,它会不会得到 readtimeout 异常?对我来说,连接挂起时有必要获得超时异常。

【问题讨论】:

  • “被动对等”是什么意思? TCP 中的“被动”用于指代侦听套接字,它根本没有读取或读取超时。

标签: java sockets timeout


【解决方案1】:

soTimeout 设置显式影响从套接字输入流读取的操作。您可以将其视为允许调用者在读取操作上定义一个定时块。来自setSoTimeout 的 Javadoc:

使用指定的超时启用/禁用 SO_TIMEOUT,以毫秒为单位。 将此选项设置为非零超时,read() 调用 与此 Socket 关联的 InputStream 将仅为此阻塞 时间。如果超时到期,则 引发了 java.net.SocketTimeoutException,尽管 Socket 仍然存在 有效。

在被动对等体的情况下,不会仅仅因为对等体没有调用read而引发超时。但是,如果确实进行了读取调用,则该调用必须在 soTimeout 过期之前返回数据,否则将引发 SocketTimeoutException。

【讨论】:

  • 谢谢。为了清楚起见,如果我将 readtimeout 设置为 1 分钟并在套接字上调用 read(),即使服务器继续在另一端写入,此方法也会抛出异常。对吗?
  • @cacert - 好吧,不一定。超时取决于 client 端的阻塞读取已等待多长时间。因此,如果您的服务器正在写入数据,但由于某种原因在soTimeout 启动之前它没有出现在客户端缓冲区中,那么是的,将引发异常。但只要客户端 reads 在超时之前返回一些数据,就会不会引发异常。
  • 好的,这是可以接受的。那么我认为我们可以说超时与非活动会话有某种关系,如果我们有一个很长但活动的会话(我们每次在超时持续时间之前定期检索数据),那么读取超时不会有问题。谢谢。
猜你喜欢
  • 2010-11-04
  • 2013-05-23
  • 2018-07-16
  • 2013-04-24
  • 2011-12-18
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多