我试图确定本地网络上的设备是否有开放端口。在阅读了很多意见之后,我一直在运行以下代码:
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),它将起作用。
任何想法可能会发生什么?
一些可能的想法:
答案 0 :(得分:1)
1000ms超时是否不足?
是
是否需要调用isConnected()?
是。如果没有连接,则会抛出异常。
setReuseAddress(true)做什么不好吗?
它可能根本没有做任何有用的事情。如果你不知道它做了什么,它在做什么呢?
此代码的主要问题是您正在泄漏套接字。您需要在finally
块中关闭套接字。
当然,这种预测未来本质上是错误的。如果您想知道端口是否正在侦听,请尝试连接到它并使用相同的套接字进行您实际想要使用的任何事务。