我正在尝试通过打开大量与服务器的套接字连接、身份验证、关闭连接然后重复来对 Java 服务器进行负载测试。我的应用运行了一段时间,但最终我得到:
java.net.BindException: Address already in use: connect
根据我阅读的文档,其原因是关闭的套接字在调用 close() 后仍然占用分配给它们的本地地址一段时间。这取决于操作系统,但可能需要几分钟。我尝试在套接字上调用 setReuseAddress(true)
,希望在调用 close()
后它的地址可以立即重用。不幸的是,情况似乎并非如此。
我的套接字创建代码是:
Socket socket = new Socket();
socket.setReuseAddress(true);
socket.connect(new InetSocketAddress(m_host, m_port));
但我仍然收到此错误:
java.net.BindException: Address already in use: connect after awhile.
还有其他方法可以完成我想做的事情吗?例如,我想:打开 100 个套接字,全部关闭,打开 200 个套接字,全部关闭,打开 300 个等等。最多 2000 个左右的套接字。
任何帮助将不胜感激!
最佳答案
您在两分钟的 TIME_WAIT 时间段内打开了这么多出站套接字,从而耗尽了出站端口的空间。您应该问自己的第一个问题是,这是否代表了实际的负载测试?真正的客户真的会这样做吗?如果没有,您只需修改测试方法即可。
BTW SO_LINGER 是 应用程序 在 close() 期间等待数据刷新的秒数。它通常为零。如果这是发出关闭的结束,则端口无论如何都会在 TIME_WAIT 间隔内徘徊。这不是一回事。可能会滥用 SO_LINGER 选项来修补问题。但是,这也会导致对等方出现异常行为,这也不是测试的目的。
关于java - "java.net.BindException: Address already in use"尝试快速创建和销毁 Socket 以进行负载测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4708649/