检测另一台设备上的端口是否使用Java打开
问题描述:
我试图确定本地网络上的设备是否有开放端口。在阅读了很多意见之后,我一直在使用以下代码:检测另一台设备上的端口是否使用Java打开
try
{
Socket s = new Socket();
s.setReuseAddress(true);
SocketAddress sa = new InetSocketAddress(ipAddress,
port);
s.connect(sa,
1000);
return s.isConnected();
}
catch (IOException e)
{
return false;
}
此代码在大多数情况下都很有效。在极少数情况下,在运行数千个设备后,此代码将报告端口80已关闭,但如果尝试抓取网页(使用Apache HTTPClient),它将起作用。
任何想法可能发生什么?
一些可能的想法:
- 是在1000毫秒超时不足?
- 是否需要调用isConnected()?
- 是否setReuseAddress(true)做了什么坏事?
答
1000ms超时是否不足?
是的。
对isConnected()的调用是否不必要?
是的。如果没有连接,则会抛出异常。
是否setReuseAddress(true)做什么坏事?
它可能没有做任何有用的事情。如果你不知道它在做什么,它在那里做了什么?
此代码的主要问题是您泄漏套接字。您需要关闭finally
块中的套接字。
当然这种预测未来本质上是错误的。如果您想知道端口是否正在侦听,请尝试连接它,并使用相同的套接字参与您实际需要处理的任何事务。
感谢您的回复。什么是更合理的超时,2000?是否有可能不引发异常,但isConnected()返回false? setReuseAddress(true)在那里,因为我看到它在其他地方提到过。我会把它拿出来。感谢您关注套接字泄露,但我确实有代码来处理这个问题(这与本次讨论无关,而且我希望尽可能少地显示代码)。 –
超时应该是几秒钟,具体取决于您的网络。不,这是不可能的。 – EJP