gpt4 book ai didi

java - 如何避免 NoRouteToHostException?

转载 作者:IT老高 更新时间:2023-10-28 20:22:51 27 4
gpt4 key购买 nike

披露:我正在编写的代码用于大学类(class)。

背景:我要完成的任务是报告不同线程技术的效果。为此,我编写了几个类,它们使用 Java 套接字响应来自客户端的请求。这个想法是用请求淹没服务器并报告不同的线程策略如何处理这个问题。每个客户端将发出 100 个请求,在每次迭代中,我们将客户端数量增加 50 个,直到出现问题。

问题:可重复且始终如一地发生异常:

Caused by: java.net.NoRouteToHostException: Cannot assign requested address    at java.net.PlainSocketImpl.socketConnect(Native Method)    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)

这发生在几种情况下,包括客户端和服务器都在本地主机上运行时。连接一段时间可以成功,尝试连接150个客户端后很快就会抛出异常。

我的第一个想法是这可能是 Linux 对打开文件描述符 (1024) 的限制,但我不这么认为。我还检查了套接字之间的所有连接是否正确关闭(即在正确的 finally block 内)。

我对发布代码犹豫不决,因为我不确定哪些部分最相关,并且不想在问题中列出大量代码。

以前有人遇到过这种情况吗?如何避免 NoRouteToHostException?


编辑(其他问题用斜体表示)

到目前为止,一些好的答案指向临时端口范围或 RFC 2780。这两者都表明我打开了太多连接。对于这两种情况,似乎需要建立的连接数才能达到此限制表明在某些时候我不会关闭连接。

在调试了客户端和服务器后,观察到两者都命中了方法调用 myJava-Net-SocketInstance.close()。这表明连接正在关闭(至少在非异常情况下)。 这是一个正确的建议吗?

另外,是否需要等待操作系统级别的端 Eloquent 能再次可用? 如果只需要很短的时间,则可以为每 50 多个客户端单独运行该程序在运行下一次尝试之前的一段时间(或者乐观地说,运行命令)。


编辑 v2.0

在接受了所提供的良好答案后,我修改了我的代码以使用 setReuseAddress(true) 方法与客户端上建立的每个 Socket 连接。这并没有达到预期的效果,我仍然限于 250-300 个客户。程序终止后,运行命令netstat -a可以看到有很多处于TIME_WAIT状态的socket连接。

我的假设是,如果套接字处于 TIME-WAIT 状态,并且已使用 SO-REUSEADDR 选项进行设置,那么任何尝试使用该选项的新套接字端口将能够 - 但是,我仍然收到 NoRouteToHostException。

这是正确的吗?还有什么办法可以解决这个问题吗?

最佳答案

您是否尝试过设置:

echo "1" >/proc/sys/net/ipv4/tcp_tw_reuse

和/或

echo "1" >/proc/sys/net/ipv4/tcp_tw_recycle

这些设置可能会使 Linux 重新使用 TIME_WAIT 套接字。不幸的是,我找不到任何明确的文档。

关于java - 如何避免 NoRouteToHostException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1572215/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com