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

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

Patricia Arquette
Lepaskan: 2024-11-27 19:13:11
asal
888 orang telah melayarinya

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));
Salin selepas log masuk

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;
    }
}
Salin selepas log masuk

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;
    }
}
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan