2017-09-19 49 views
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)做了什麼壞事?

回答

1

1000ms超時是否不足?

是的。

對isConnected()的調用是否不必要?

是的。如果沒有連接,則會拋出異常。

是否setReuseAddress(true)做什麼壞事?

它可能沒有做任何有用的事情。如果你不知道它在做什麼,它在那裏做了什麼?

此代碼的主要問題是您泄漏套接字。您需要關閉finally塊中的套接字。

當然這種預測未來本質上是錯誤的。如果您想知道端口是否正在偵聽,請嘗試連接它,並使用相同的套接字參與您實際需要處理的任何事務。

+0

感謝您的回覆。什麼是更合理的超時,2000?是否有可能不引發異常,但isConnected()返回false? setReuseAddress(true)在那裏,因爲我看到它在其他地方提到過。我會把它拿出來。感謝您關注套接字泄露,但我確實有代碼來處理這個問題(這與本次討論無關,而且我希望儘可能少地顯示代碼)。 –

+0

超時應該是幾秒鐘,具體取決於您的網絡。不,這是不可能的。 – EJP

相關問題