有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何避免NorouteToHoste异常?

披露:我正在编写的代码是针对大学课程的

背景:我要完成的任务是报告不同线程技术的效果。为此,我编写了几个类,它们使用Javasocket响应客户机的请求。其想法是向服务器发送大量请求,并报告不同的线程策略如何应对这种情况。每个客户机将发出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)的限制,但我不这么认为。我还检查了socket之间的所有连接是否正确关闭(即在正确的finally块内)

我很犹豫是否发布代码,因为我不确定哪些部分最相关,也不想在问题中列出大量代码

以前有人见过这个吗?我怎样才能避免NOROUTETHOSTE例外


编辑(其他问题用斜体标出)

到目前为止,一些很好的答案要么指向短暂的港口范围,要么指向RFC2780。这两个都表明我有太多的连接打开。对于这两种情况,要达到这个极限所需的连接数量似乎表明,在某个时刻,我并没有关闭连接

在对客户端和服务器进行调试之后,观察到它们都进行了方法调用myJava-Net-SocketInstance.close()。这表明连接正在关闭(至少在非例外情况下)<这是正确的建议吗

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


编辑v2。0

在接受了提供的正确答案后,我修改了代码,在客户端进行的每个socket连接中使用setReuseAddress(true)方法。这并没有达到预期的效果,我仍然被限制为250-300个客户。程序终止后,运行命令netstat -a表明在TIME_WAIT状态下有很多socket连接

我的假设是,如果一个socket处于TIME-WAIT状态,并且已经设置了SO-REUSEADDR选项,那么任何试图使用该端口的新socket都将能够-但是,我仍然收到NoRouteToHostException

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


共 (0) 个答案