1
我試圖確定本地網絡上的設備是否有開放端口。在閱讀了很多意見之後,我一直在使用以下代碼:檢測另一臺設備上的端口是否使用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)做了什麼壞事?
感謝您的回覆。什麼是更合理的超時,2000?是否有可能不引發異常,但isConnected()返回false? setReuseAddress(true)在那裏,因爲我看到它在其他地方提到過。我會把它拿出來。感謝您關注套接字泄露,但我確實有代碼來處理這個問題(這與本次討論無關,而且我希望儘可能少地顯示代碼)。 –
超時應該是幾秒鐘,具體取決於您的網絡。不,這是不可能的。 – EJP