我有一个简单的服务器客户端应用程序。一切正常,但在某个阶段,从服务器获取响应需要5分钟以上(这是正常的,它需要像这样)。问题是,如果超过5分钟,我会一直收到此异常:java.net.SocketTimeoutException: Read timed out
。
所以我想知道在Windows上或我可以设置的Java虚拟机上是否存在默认套接字超时?我无法更改客户端代码,因此setSoTimeout()
不适合我。
使用Windows XP ..
编辑:据我所知,现在是在客户端没有打开套接字连接。它从服务器传递。所以我反编译了服务器jar文件。但是仍然无法找到关于超时的任何信息。答案 0 :(得分:10)
默认套接字超时为0,表示永不超时。如果它在5分钟后实际超时,则表示它已在代码中设置。如果源不可用,并且没有配置,您可以尝试反编译该类,并查找setSoTimeout
个调用。
由于评论以及搜索未找到任何setSoTimeout()调用的事实,您可以采用不同的方法。只是让它超时,然后编写一个小脚本,它将重试该调用,以防万一。如果你可以从命令行调用你的客户端,你可以解析输出,如果它继续在stderr上。
答案 1 :(得分:8)
长时间保持未使用的TCP连接没有任何流量并不是那么简单。一些超时后,许多防火墙/路由器关闭未使用的端口。
一个选项可能是实现简单的keepalive协议,偶尔发送虚拟数据包,但如果你不能触摸客户端代码,这可能不是一个选项。
编辑:我不知道有什么方法可以覆盖客户端代码中设置的setSoTimeout()。
答案 2 :(得分:0)
回答0是默认超时并不完全正确。例如,由于Axis2客户端默认60秒超时,因此它将取决于您用于拨打电话的实现类型。
您能提供更多详情吗?很抱歉写在答案部分,但我没有足够的声誉做评论:)
答案 3 :(得分:0)
你需要保持连接活着吗?为什么不重新考虑它以使其更加异步。该架构根本没有扩展。有一次,所有可用线程都可能正在等待服务器的长时间响应。