"java.net.BindException:已经在使用的地址",当尝试快速创建Socket并进行负载测试时进行销毁

bra*_*287 27 java sockets networking tcp

我正在尝试通过打开大量与服务器的套接字连接来加载测试Java服务器,验证,关闭连接,然后重复.我的应用程序运行了一段时间,但最终我得到:

java.net.BindException:地址已在使用中:connect

根据我读过的文档,其原因是在调用close()之后的一段时间内,关闭的套接字仍占用分配给它们的本地地址.这取决于操作系统,但可以是几分钟.我试着调用setReuseAddress(true)socket,希望它的地址在close()被调用后可以立即重用.不幸的是,情况似乎并非如此.

我的套接字创建代码是:

Socket socket = new Socket();
socket.setReuseAddress(true);
socket.connect(new InetSocketAddress(m_host, m_port));
Run Code Online (Sandbox Code Playgroud)

但我仍然得到这个错误:

java.net.BindException:已经在使用的地址:一段时间后连接.

有没有其他方法可以完成我想要做的事情?我想举个例子:打开100个插座,关闭它们,打开200个插座,全部关闭,打开300个等,最多可达200​​0个左右的插座.

任何帮助将不胜感激!

use*_*421 20

通过在TIME_WAIT两分钟内打开许多出站套接字,您将耗尽出站端口的空间.您应该问自己的第一个问题是,这是否代表了一个真实的负载测试?真正的客户真的会这样做吗?如果没有,您只需要修改您的测试方法.

BTW SO_LINGER是应用程序在close()期间等待刷新数据的秒数.它通常为零.如果这是发出结束的结束,端口将在TIME_WAIT间隔内闲逛.这不是一回事.可以滥用SO_LINGER选项来修补问题.然而,这也将导致同行的异常行为,并且这不是测试的目的.