java - "java.net.BindException: Address already in use"尝试快速创建和销毁 Socket 以进行负载测试

标签 java sockets networking tcp

我正在尝试通过打开大量与服务器的套接字连接、身份验证、关闭连接然后重复来对 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/

相关文章:

python - 无法填充 Bokeh 网络图中的悬停工具提示值

c# - monodroid中Task的实现

java - 如何让maven使用测试资源

java - 在java中播放mp3文件 - nullpointerException

security - 如何防止基于UDP的 channel 变成 “backdoor”?

java - java客户端中的NullPointer异常?

c++ - 配置OpenWrt进行socket编程的问题

c - 跳过指纹读取器 PAM 模块以从 C 应用程序使用 PAM 进行身份验证

Java GridBayLayout 替换组件

ios - Spaceteam 如何运作?