首頁  >  文章  >  Java  >  為什麼即使主機可 Ping 通,「InetAddress.isReachable()」有時也會回傳 False?

為什麼即使主機可 Ping 通,「InetAddress.isReachable()」有時也會回傳 False?

Patricia Arquette
Patricia Arquette原創
2024-11-27 19:13:11794瀏覽

Why Does `InetAddress.isReachable()` Sometimes Return False Even When a Host is Pingable?

調查InetAddress.isReachable() 的錯誤可達性

InetAddress 是一個用於處理IP 位址的Java 類,提供了各各種網路的方法-相關任務。此類方法之一是 isReachable(),用於確定主機是否可透過網路存取。但是,在某些情況下,即使 ping IP 位址成功,此方法也可能傳回 false。

請考慮以下嘗試檢查主機可達性的程式碼片段:

InetAddress byName = InetAddress.getByName("173.39.161.140");
System.out.println(byName);
System.out.println(byName.isReachable(1000));

如果執行此程式碼時,您可能會遇到isReachable() 傳回false 的情況,儘管您可以ping 指定的IP 位址。

To為了解決這個問題,提出了一種替代方法,該方法保持平台無關性,並利用有關遠端電腦上開放連接埠的資訊。

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;
    }
}

透過使用此程式碼,您可以透過嘗試確定主機的可及性建立與該主機上已知開放連接埠的連線。

更新:

獲取更簡潔的版本代碼片段的詳細信息,請參考以下內容:

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;
    }
}

通過採用此方法,即使在InetAddress.isReachable() 無法提供準確指示的情況下,您也可以可靠地確定主機的可及性。

以上是為什麼即使主機可 Ping 通,「InetAddress.isReachable()」有時也會回傳 False?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn