在java中测试套接字#连接超时

在java中测试套接字#连接超时,java,sockets,testing,Java,Sockets,Testing,我最近正在调查一个java应用程序的操作问题。在同一台主机上运行两个进程processA和processB processA与processB建立套接字连接。processB重新启动,但在重新启动后,来自processA的所有Socket#connect调用都被阻塞(数分钟) 我认为processB不知何故使其套接字处于断开状态(接收SYN但从未响应)。这个问题自行修复(自动重启),因此我无法确定捕获tcp流量 我知道我们的套接字客户端在连接时应该有一个短的超时(在这种情况下,操作系统默认值似乎

我最近正在调查一个java应用程序的操作问题。在同一台主机上运行两个进程processA和processB

processA与processB建立套接字连接。processB重新启动,但在重新启动后,来自processA的所有Socket#connect调用都被阻塞(数分钟)

我认为processB不知何故使其套接字处于断开状态(接收SYN但从未响应)。这个问题自行修复(自动重启),因此我无法确定捕获tcp流量

我知道我们的套接字客户端在连接时应该有一个短的超时(在这种情况下,操作系统默认值似乎很大)

我只是好奇如何为我的套接字客户端编写一个失败的测试

是否可以这样做:

@Test
public void testClientTimeoutOnConnectionAttempt() {
    startBrokenSocketServer()
    assertConnectionExceptionWithinOneSecond(myClient);
}
我知道如何使用ipfw和netcat手动创建这些条件

 sudo ipfw add 100 drop ip from 127.0.0.1 6969 to any
 nc -l -p 6969
nc在6969上侦听(阻止os发送rst、ack),ipfw阻止我的java进程从nc接收任何syn_ack

在Socket#connect调用没有超时的情况下(在mac os上)发生SocketException需要75秒。如果我指定一个超时,它会更早失败

我需要修改的客户端属于另一个团队。我想为他们提供一个修复程序和一个演示它的自动测试。有什么办法吗

我只是好奇如何为我的套接字客户端编写一个失败的测试

我认为这在Java中是不可能的。您当然可以模拟netcat的许多功能,但不能模拟ipfw。我甚至不确定这在C语言中是否可行,除非您执行一些非常特定于操作系统的内核调用

我认为从Java可以做的最好的事情就是连接到一个不存在的主机。您不能只是尝试连接到本地网络上不存在的IP,因为本地以太网硬件可能会更快地发生故障。您想要的是连接到远程网络上不存在的无效IP。选择一个与您的本地网络不对应的10个网络地址可能会起作用


回答站不住脚,但我看不出还有其他办法。

谢谢格雷。这确实有帮助。也许捕捉这些信息的最佳方法是使用类似findbugs的代码分析工具。我认为应该避免使用没有超时的connect版本。是的,同意。很长一段时间以来,即使在C语言世界中也是如此。默认的内核超时时间大约为分钟,而在99%的现代web应用程序中,这一时间实在太长了。