Java:套接字读取超时异常

时间:2012-09-13 12:46:51

标签: java sockets exception timeout

我试图打电话给一个非常重的过程。 它的平均工作时间估计为9-10分钟。

当我执行该过程时,我将超时设置为一个非常庞大的数字:99999999。

2分钟后,我收到以下错误:

  

java.net.SocketTimeoutException:读取超时

我试图把它弄得更糟,我把超时设置为3000,并且在预期的3秒后我得到了同样的错误。

您是否知道为什么socket.setSoTimeout(99999999)将其设置为最大120000?

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题而且没有使用解决方案 socket.shutdownInput(); socket.shutDownOutput();直到最后一次向套接字读取或写入数据。这使得套接字进入FIN_WAIT状态,因此在关闭前等待2分钟。您可以在this post

中详细了解相关信息

答案 1 :(得分:2)

显然,您没有设置您认为正在设置的超时,或者其他人正在更改它。你必须发布一些代码才能得到进一步的解释。

请注意,根据WR Stevens在 TCP / IP Illustrated,第二卷,#17.4中,超时保持短暂的1000Hz刻度,因此超时超过11分钟可能。这适用于BSD代码。

答案 2 :(得分:1)

我不确定您的应用程序是如何工作的,但尝试设置无限timeout to the socket

public void setSoTimeout(int timeout)
              throws SocketException
     

使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。如果将此选项设置为非零超时,则与此Socket关联的read()上的InputStream调用将仅阻止这段时间。如果超时到期,则引发java.net.SocketTimeoutException,尽管Socket仍然有效。必须在进入阻止操作之前启用该选项才能生效。超时必须为> 0。超时为零被解释为无限超时。

如果您提供有关通话的更多信息,我可以改进答案。