【发布时间】:2011-09-01 06:19:16
【问题描述】:
我有一种情况,Java 程序与服务器建立了一个长时间运行的 TCP/IP 连接,并且该连接的功能与记录的完全一样,除了我无法控制的环境中的一件事。
每个星期六该服务器都会重新启动,但由于某种原因,这没有正确地传达给我的客户端,因此连接一直挂起等待响应。这与陈旧的 JDBC 连接所见的行为完全相同,服务器和客户端之间的某些路由器发现连接空闲并在没有通知的情况下将其丢弃。
我需要能够重现此场景才能创建正确的修复程序。
因此我需要知道是否有一种好方法可以模拟路由器在我的控制下静默断开连接?
我可以在我的开发环境和服务器之间放置一个 Linux 机器或 Mac。如果我可以在虚拟机(vmware 播放器)中进行放置,我可以在虚拟机中运行 JVM。
非常欢迎提出建议。
编辑 2012-12-18:对我有用的解决方案是在本地使用基于 Java 的 SOCKS5 代理,可以随意使用 Ctrl-Z 暂停,并告诉我的应用程序通过它。
【问题讨论】:
-
您是否在客户端和服务器的套接字上使用 TCP Keepalives(
SO_KEEPALIVE选项)? -
@Mike,可能不会。套接字代码在第三方库中。
-
好吧,如果客户端无限期挂起是不可接受的,听起来keepalives会很有用。
-
正确的解决方法是让客户端设置 TCP keepalive,如果您不介意等待两个小时,或者使用更实际的超时值调用 Socket.setSoTimeout(),例如几分钟。
-
@Mike,很可能,但不幸的是我无法更改所述第三方库。
标签: java linux networking tcp