Rumah  >  Artikel  >  Java  >  Mengapakah `InetAddress.isReachable()` Kadang-kadang Kembali Palsu Walaupun Hos Boleh Ping?

Mengapakah `InetAddress.isReachable()` Kadang-kadang Kembali Palsu Walaupun Hos Boleh Ping?

Patricia Arquette
Patricia Arquetteasal
2024-11-27 19:13:11795semak imbas

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

Menyiasat Kebolehcapaian Palsu daripada InetAddress.isReachable()

InetAddress, kelas Java untuk bekerja dengan alamat IP, menyediakan kaedah untuk pelbagai rangkaian- tugasan yang berkaitan. Satu kaedah sedemikian ialah isReachable(), digunakan untuk menentukan sama ada hos boleh diakses melalui rangkaian. Walau bagaimanapun, dalam sesetengah kes, kaedah ini mungkin kembali palsu walaupun apabila ping alamat IP berjaya.

Pertimbangkan coretan kod berikut yang cuba menyemak kebolehcapaian hos:

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

Jika anda menjalankan kod ini, anda mungkin menghadapi situasi di mana isReachable() mengembalikan palsu, walaupun pada hakikatnya anda boleh ping IP yang ditentukan alamat.

Untuk menangani isu ini, pendekatan alternatif dibentangkan, yang kekal bebas platform dan memanfaatkan maklumat tentang port terbuka pada mesin jauh.

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

Dengan menggunakan kod ini, anda boleh menentukan kebolehcapaian hos dengan cuba mewujudkan sambungan ke port terbuka yang diketahui pada itu hos.

Kemas kini:

Untuk versi yang lebih ringkas bagi coretan kod, rujuk perkara berikut:

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

Dengan menggunakan pendekatan ini , anda boleh menentukan kebolehcapaian hos dengan pasti, walaupun dalam senario di mana InetAddress.isReachable() tidak memberikan yang tepat petunjuk.

Atas ialah kandungan terperinci Mengapakah `InetAddress.isReachable()` Kadang-kadang Kembali Palsu Walaupun Hos Boleh Ping?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn