14

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

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

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

java.net.SocketTimeoutException:读取超时

我试图再弄乱它一些,我将超时设置为 3000,并且在预期的 3 秒后,我得到了同样的错误。

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

4

3 回答 3

4

我遇到了同样的问题, socket.shutdownInput(); socket.shutDownOutput();直到最后一次读取或写入数据到套接字时才使用该解决方案。这使套接字进入 FIN_WAIT 状态,因此在关闭前等待 2 分钟。你可以在这篇文章中阅读更多关于它的信息

于 2013-06-11T07:53:39.123 回答
2

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

请注意,根据TCP/IP Illustrated, Vol II, #17.4 中的 WR Stevens 的说法,超时保持在 1000Hz 滴答数的短时间内,因此不可能超过 11 分钟。这适用于 BSD 代码。

于 2013-02-09T09:47:57.490 回答
1

我不确定您的应用程序是如何工作的,但请尝试为套接字设置无限超时

public void setSoTimeout(int timeout)
              throws SocketException

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

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

于 2012-09-13T12:54:33.733 回答