繁体   English   中英

Java:套接字读取超时异常

[英]Java: socket read time out exception

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

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

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

java.net.SocketTimeoutException:读取超时

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

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

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

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

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

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

 public void setSoTimeout(int timeout) throws SocketException 

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM