儘管Ping 可訪問,InetAddress.isReachable() 返回False
在Java 中,InetAddress.isReachable() 用於檢查給定的IP 是否位址可以從目前機器存取。令人驚訝的是,即使您可以成功 ping IP 位址,您也可能會遇到此方法傳回 false 的情況。
出現這種不一致的原因是 InetAddress.isReachable() 不使用與 ping 相同的機制。相反,它採用底層平台的互聯網控制訊息協定 (ICMP) 實現,這可能與 ping 命令不同。
平台獨立解決方案
解決為了解決這種差異並獲得平台獨立性,請考慮以下方法:
private static boolean isReachable(String addr, int openPort, int timeOutMillis) { // Any Open port on other machine // openPort = 22 - ssh, 80 or 443 - webserver, 25 - mailserver etc. try (Socket soc = new Socket()) { soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis); return true; } catch (IOException ex) { return false; } }
此解決方案檢查透過嘗試使用TCP 協定連接到開放連接埠(例如,用於SSH 的連接埠22、用於Web 伺服器的連接埠80 或443等)來取得指定的 IP 位址。如果連線成功,則認為IP位址可達;
簡潔版本
為簡潔起見,您可以將程式碼壓縮如下:
private static boolean isReachable(String addr, int openPort, int timeOutMillis) { try (Socket soc = new Socket()) { soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis); return true; } catch (IOException ex) { return false; } }
此平台無關方法提供了一種可靠的方法來確定IP 位址的可及性,而不管底層ICMP 如何實施。
以上是為什麼 Ping 成功時 `InetAddress.isReachable()` 有時會回傳 False?的詳細內容。更多資訊請關注PHP中文網其他相關文章!