Heim >Java >javaLernprogramm >Warum gibt „InetAddress.isReachable()' manchmal „False' zurück, wenn der Ping erfolgreich ist?
InetAddress.isReachable() gibt trotz Ping-Erreichbarkeit „Falsch“ zurück
In Java wird InetAddress.isReachable() verwendet, um zu überprüfen, ob eine bestimmte IP vorhanden ist Die Adresse ist vom aktuellen Computer aus erreichbar. Überraschenderweise kann es zu einem Szenario kommen, in dem diese Methode „false“ zurückgibt, obwohl Sie die IP-Adresse erfolgreich anpingen können.
Diese Inkonsistenz entsteht, weil InetAddress.isReachable() nicht denselben Mechanismus wie Ping verwendet. Stattdessen wird die Implementierung des Internet Control Message Protocol (ICMP) der zugrunde liegenden Plattform verwendet, die sich vom Ping-Befehl unterscheiden kann.
Plattformunabhängige Lösung
Zur Adressierung Um diese Diskrepanz zu beseitigen und Plattformunabhängigkeit zu erlangen, sollten Sie den folgenden Ansatz in Betracht ziehen:
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; } }
Diese Lösung prüft die Erreichbarkeit der angegebenen IP-Adresse durch Versuche um über das TCP-Protokoll eine Verbindung zu einem offenen Port (z. B. Port 22 für SSH, Port 80 oder 443 für Webserver usw.) herzustellen. Wenn die Verbindung erfolgreich ist, gilt die IP-Adresse als erreichbar; andernfalls weist es auf Unerreichbarkeit hin.
Kurze Version
Der Kürze halber können Sie den Code wie folgt zusammenfassen:
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; } }
Dies ist plattformunabhängig Der Ansatz bietet eine zuverlässige Möglichkeit, die Erreichbarkeit einer IP-Adresse unabhängig von der zugrunde liegenden ICMP-Implementierung festzustellen.
Das obige ist der detaillierte Inhalt vonWarum gibt „InetAddress.isReachable()' manchmal „False' zurück, wenn der Ping erfolgreich ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!