检测另一台设备上的端口是否使用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块中的套接字。

当然这种预测未来本质上是错误的。如果您想知道端口是否正在侦听,请尝试连接它,并使用相同的套接字参与您实际需要处理的任何事务。

+0

感谢您的回复。什么是更合理的超时,2000?是否有可能不引发异常,但isConnected()返回false? setReuseAddress(true)在那里,因为我看到它在其他地方提到过。我会把它拿出来。感谢您关注套接字泄露,但我确实有代码来处理这个问题(这与本次讨论无关,而且我希望尽可能少地显示代码)。 –

+0

超时应该是几秒钟,具体取决于您的网络。不,这是不可能的。 – EJP