我试图打电话给一个非常繁重的过程。它的平均工作时间估计为 9-10 分钟。
当我执行这个过程时,我将超时设置为一个非常大的数字:99999999。
2分钟后,我收到以下错误:
java.net.SocketTimeoutException:读取超时
我试图再弄乱它一些,我将超时设置为 3000,并且在预期的 3 秒后,我得到了同样的错误。
您知道为什么socket.setSoTimeout(99999999)
将其设置为最大 120000 吗?
我遇到了同样的问题,
socket.shutdownInput(); socket.shutDownOutput();
直到最后一次读取或写入数据到套接字时才使用该解决方案。这使套接字进入 FIN_WAIT 状态,因此在关闭前等待 2 分钟。你可以在这篇文章中阅读更多关于它的信息
显然,您没有设置您认为您正在设置的超时,或者其他人在之后更改它。您必须发布一些代码才能进一步阐明。
请注意,根据TCP/IP Illustrated, Vol II, #17.4 中的 WR Stevens 的说法,超时保持在 1000Hz 滴答数的短时间内,因此不可能超过 11 分钟。这适用于 BSD 代码。
我不确定您的应用程序是如何工作的,但请尝试为套接字设置无限超时
public void setSoTimeout(int timeout) throws SocketException
使用指定的超时启用/禁用
SO_TIMEOUT
,以毫秒为单位。将此选项设置为非零超时,与此 Socket 关联的read()
调用InputStream
将仅阻塞此时间量。如果超时到期,java.net.SocketTimeoutException
则引发 a,尽管 Socket 仍然有效。必须在进入阻塞操作之前启用该选项才能生效。超时必须是> 0
。超时为零被解释为无限超时。
如果您提供有关您的电话的更多信息,我可能会改进答案。