Java,增加套接字超时

Java,增加套接字超时,java,sockets,timeout,Java,Sockets,Timeout,我有一个简单的服务器客户端应用程序。一切正常,但在某个阶段,从服务器获得响应需要5分钟以上(这是正常的,需要这样)。问题是,如果花费的时间超过5分钟,我会一直得到这个异常:java.net.SocketTimeoutException:Read timed out 所以我想知道在windows或Java虚拟机上是否有默认的套接字超时?我无法更改客户端代码,因此setSoTimeout()不是我的选项 使用Windows XP 编辑:据我现在了解,套接字连接没有在客户端打开。它是从服务器传递的。所

我有一个简单的服务器客户端应用程序。一切正常,但在某个阶段,从服务器获得响应需要5分钟以上(这是正常的,需要这样)。问题是,如果花费的时间超过5分钟,我会一直得到这个异常:
java.net.SocketTimeoutException:Read timed out

所以我想知道在windows或Java虚拟机上是否有默认的套接字超时?我无法更改客户端代码,因此
setSoTimeout()
不是我的选项

使用Windows XP


编辑:据我现在了解,套接字连接没有在客户端打开。它是从服务器传递的。所以我反编译了所有的服务器jar文件。但是仍然找不到有关超时的任何信息。

默认套接字超时为0,这意味着从不超时。如果它实际上在5分钟后超时,则表示它已在代码中设置。如果源代码不可用,并且没有配置,您可以尝试反编译该类,并查找
setSoTimeout
调用


由于注释和搜索没有找到任何setSoTimeout()调用的事实,您可以采取不同的方法。只需让它超时,并编写一个小脚本,以备调用超时时重试。如果可以从命令行调用客户机,则可以解析输出(如果输出在stderr上)。

长时间打开未使用的TCP连接而不产生任何流量并不是那么简单。许多防火墙/路由器在超时后关闭未使用的端口

一种选择是实现简单的keepalive协议,时不时地发送虚拟数据包,但是如果您不能触摸客户端代码,那么这可能不是一种选择


编辑:我不知道有什么方法可以覆盖客户端代码中设置的setSoTimeout()。

回答0是默认超时并不完全正确。例如,由于Axis2客户机具有默认的60秒超时,因此它将取决于您用来进行调用的实现类型


你能提供更多细节吗?很抱歉在“答案”部分写下,但我没有足够的声誉来发表评论:)

您需要保持连接的活力吗?为什么不重新考虑一下,使它更加异步呢。该模式根本没有可伸缩性。在某一点上,所有可用线程可能都在等待服务器的长时间响应。

我反编译并查找
setSoTimeout
调用,但没有找到任何内容。那么它必须在其他地方设置?@hs2d我想它使用了int字段0的默认值查看这里的代码,我只能看到
java.io.InputStream
。所以必须从服务器到客户端进行连接?是的,对于Java,默认值是无限的,但是库可能会改变这一点。也许是一个提示,hs2d,你有任何罐子包括在内吗?或者,你可以采取另一种方法,让它超时,如果失败就重试。检查超时是否是使用系统属性配置的。@HannoBinder,你能解释一下你所说的系统属性是什么意思吗?我的意思是类似的,或者任何可能适用于你客户端连接方式的东西。套接字超时是由客户端设置的。”未在客户端打开套接字连接。从服务器传来的信息“不正确”。@benez我不同意。如果路由器认为连接是一种宝贵的资源,它会超时,那么你就没有必要欺骗它使其保持开放。无论如何,您仍然必须处理连接丢失。添加keepalive ping实际上只是一个毫无意义的麻烦。@EJP我还没有看到一个处理连接丢失的正确实现。在某些情况下,您需要等待实时更新,并且需要双方不断连接以保持数据同步。连接丢失不是通过简单的重新连接来处理的。你会错过一条重要的信息,或者很晚才收到。e、 股票市场总是发出心跳,irc协议要求你回答乒乓球。是的,您必须处理连接丢失问题,但您可能希望在某些程序中避免这些问题。@EJP添加心跳可能非常关键。想象一下下面的场景:空闲一段时间后,其中一台计算机出现了电源故障。在完全断开连接的情况下,TCP/IP协议会通知另一方这一点,但与此相反,当其中一台计算机发生电源故障时,当然没有人会得到通知。这不会被自动检测到。在这种情况下,根据另一台计算机的说法,连接仍然建立,一切似乎都很好。只有当客户机尝试实际发送某些内容时,它才会检测到问题。如果他想从中读取,他需要保持连接的活动状态。我对这一切一无所知。