我有一个简单的服务器客户机应用程序。一切工作,但在某些阶段,它需要超过5分钟从服务器获得响应(这是正常的,它需要像这样)。问题是,如果需要超过5分钟,我一直得到这个例外:java.net.SocketTimeoutException: Read timed out
。
所以我想知道是否有一些默认的套接字超时在windows或Java虚拟机上我可以设置?我不能改变客户端代码,所以setSoTimeout()
不是我的选择。
使用Windows XP.
编辑:正如我现在所理解的,套接字连接没有在客户端打开。它是从服务器传递过来的。所以我反编译了所有的服务器jar文件。默认的套接字超时为0,这意味着永远不会超时。如果它确实在5分钟后超时,则意味着它已在代码中设置。如果源代码不可用,并且没有配置,您可以尝试反编译类,并查找setSoTimeout
调用。
既然有注释,而且搜索没有找到任何setSoTimeout()调用,那么您可以采用不同的方法。只要让它超时,并编写一个小脚本,在它超时的情况下重试调用。如果可以从命令行调用客户机,则可以解析输出,如果输出出现错误
在没有任何流量的情况下长时间保持未使用的TCP连接是很重要的。许多防火墙/路由器在超时后关闭未使用的端口。
一个选项可能是实现简单的keepalive协议来发送虚拟数据包,但如果你不能触摸客户端代码,这可能不是一个选项。
编辑:我不知道有任何方法重写setSoTimeout()设置在客户端代码。
回答0是默认超时并不完全正确。例如,Axis2客户机具有默认的60秒超时,因此它将取决于您使用哪种实现来进行调用。
你能提供更多细节吗?很抱歉写在回答部分,但我没有足够的声誉来做评论:)
您需要保持连接存活吗?你为什么不重新考虑一下,让它更异步一些呢?这种模式根本无法扩展。在某一时刻,所有可用的线程都可能等待来自服务器的长时间响应。