在java中测试Socket #connect timeout

时间:2011-12-03 11:37:17

标签: java sockets testing

我最近正在调查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,确认),ipfw阻止我的java进程从nc接收任何syn_ack。

在Socket#连接调用中没有任何超时,在SocketException之前花了75秒(在mac os上)。如果我指定超时,则会提前失败。

我需要修改的客户端属于另一个团队。我想向他们发送修复程序以及演示它的自动化测试。关于如何做到的任何想法?

1 个答案:

答案 0 :(得分:2)

  

我很好奇如何为我的套接字客户端编写失败的测试。

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

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

Lame回答,但我没有看到任何其他方式。