Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:套接字读取超时异常_Java_Sockets_Exception_Timeout - Fatal编程技术网

Java:套接字读取超时异常

Java:套接字读取超时异常,java,sockets,exception,timeout,Java,Sockets,Exception,Timeout,我试图打电话给一个非常繁重的流程。 它的平均工作时间估计为9-10分钟 当我执行这个过程时,我设置了一个非常大的超时值:99999999 2分钟后,我得到以下错误: java.net.SocketTimeoutException:读取超时 我试图把它弄得更糟一些,我把超时设置为3000,3秒钟后,我得到了同样的错误 你知道为什么socket.setSoTimeout(999999999)会将其设置为最大120000吗?我不知道你的应用程序是如何工作的,但请尝试设置一个无限大的值 使用指定的超时启

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

当我执行这个过程时,我设置了一个非常大的超时值:99999999

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

java.net.SocketTimeoutException:读取超时

我试图把它弄得更糟一些,我把超时设置为3000,3秒钟后,我得到了同样的错误


你知道为什么
socket.setSoTimeout(999999999)
会将其设置为最大120000吗?

我不知道你的应用程序是如何工作的,但请尝试设置一个无限大的值

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


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

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


请注意,根据《TCP/IP图解》第二卷第17.4节中的W.R.Stevens所述,超时时间为1000Hz,因此不可能超过11分钟。这适用于BSD代码。

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

中了解更多信息。此方法将传递给操作系统,因此此方法的行为取决于您的操作系统。您使用的是哪个版本的操作系统?您是否尝试过发送保持活动状态的消息,或者在完成后让进程“呼叫”您,而不是让套接字保持打开状态很久?似乎操作系统只是拒绝您的值,因为如果它超出范围。我会尝试使用更高的值,但不会太高(您将其设置为超过27小时)。v、 例如,3分钟,5分钟,10分钟。如果你不想超时,我会尝试不设置它,而不是将它设置得很高。我将它设置为3分钟,但2分钟后我得到一个例外。我尝试将超时设置为0。(这应该是无限时间)但同样,在120秒后,它抛出一个异常。当你连接时,缓冲区是否读取任何数据?我的意思是,服务器是否响应您的连接?因为有可能服务器地址在您的网络中没有正确解析,我不知道它是本地的,还是vpn,或者只是远程服务器,我不知道地址是使用netbios查询、主机文件或远程dns解析的,有很多因素可能会导致错误的地址服务器是本地的,当我将重载过程设置为不超过2分钟时,它就可以正常工作。是否有任何应用程序容器可能会用默认超时覆盖您的连接超时,如Websphere,服务器端还是客户端的apache tomcat或jboss?如果是这样的话,您应该检查环境的配置FER13488,没有任何容器。这种技术不可能解决读取超时异常。如果您花时间运行我的测试用例,您会发现这就是解决方案。您可以自己尝试,将一些输入写入套接字,然后使用
shutdownpoint
,您将看到套接字将变为FIN_WAIT状态。等待2分钟,您将看到套接字已关闭。关闭套接字对读取超时没有影响。关闭另一端可能会,但发送一些东西也会。这并没有解决以下问题:“为什么socket.setSoTimeout(999999999)将其设置为最大120000?”而“socket.setSoTimeout(9999999)将其设置为最大120000”只是一个副作用。假设您创建了一个套接字并连接到另一端,您可以通过netstat-na | find“portnumber”看到套接字处于已建立状态。现在发送一些输入并使用
shutdownport
您将看到套接字状态变为CLOSE\u WAIT。同样,如果你想在我的帖子中运行我的测试用例,你自己也可以看到。问题是“socket.setSoTimeout(999999999)将其设置为最大120000”。关闭套接字确实会改变端口状态,发送FIN,并在读卡器上造成EOS状态,但不会改变读取超时。您不必运行测试用例就能知道这一点。
public void setSoTimeout(int timeout)
              throws SocketException