Ich verwende diesen Teil des Codes, um eine IP-Adresse in Java zu pingen, aber nur das Pingen von localhost ist erfolgreich und für die anderen Hosts sagt das Programm, dass der Host nicht erreichbar ist. Ich habe meine Firewall deaktiviert, habe aber immer noch dieses Problem
public static void main(String[] args) throws UnknownHostException, IOException {
String ipAddress = "127.0.0.1";
InetAddress inet = InetAddress.getByName(ipAddress);
System.out.println("Sending Ping Request to " + ipAddress);
System.out.println(inet.isReachable(5000) ? "Host is reachable" : "Host is NOT reachable");
ipAddress = "173.194.32.38";
inet = InetAddress.getByName(ipAddress);
System.out.println("Sending Ping Request to " + ipAddress);
System.out.println(inet.isReachable(5000) ? "Host is reachable" : "Host is NOT reachable");
}
Die Ausgabe ist:
Senden einer Ping-Anfrage an 127.0.0.1
Host ist erreichbar
Senden einer Ping-Anfrage an 173.194.32.38
Host ist NICHT erreichbar
Antworten:
Sie können nicht einfach in Java pingen, da es auf ICMP basiert, das in Java leider nicht unterstützt wird
http://mindprod.com/jgloss/ping.html
Verwenden Sie stattdessen Steckdosen
Ich hoffe es hilft
quelle
InetAddress.isReachable()
laut javadoc :Option 1 (ICMP) erfordert normalerweise Administratorrechte
(root)
.quelle
ping
Befehl unter Linux lautet set-uid root. Aus diesem Grund können Nicht-Root-Benutzer es verwenden, obwohl es ICMP ECHO_REQUEST verwendet.Ich denke, dieser Code wird Ihnen helfen:
public class PingExample { public static void main(String[] args){ try{ InetAddress address = InetAddress.getByName("192.168.1.103"); boolean reachable = address.isReachable(10000); System.out.println("Is host reachable? " + reachable); } catch (Exception e){ e.printStackTrace(); } } }
quelle
Überprüfen Sie Ihre Konnektivität. Auf meinem Computer wird REACHABLE für beide IPs gedruckt:
BEARBEITEN:
Sie können versuchen, den Code so zu ändern, dass er getByAddress () verwendet, um die Adresse zu erhalten:
public static void main(String[] args) throws UnknownHostException, IOException { InetAddress inet; inet = InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 }); System.out.println("Sending Ping Request to " + inet); System.out.println(inet.isReachable(5000) ? "Host is reachable" : "Host is NOT reachable"); inet = InetAddress.getByAddress(new byte[] { (byte) 173, (byte) 194, 32, 38 }); System.out.println("Sending Ping Request to " + inet); System.out.println(inet.isReachable(5000) ? "Host is reachable" : "Host is NOT reachable"); }
Die Methoden getByName () versuchen möglicherweise eine umgekehrte DNS-Suche, die auf Ihrem Computer möglicherweise nicht möglich ist. GetByAddress () umgeht dies möglicherweise.
quelle
Es wird sicher funktionieren
import java.io.*; import java.util.*; public class JavaPingExampleProgram { public static void main(String args[]) throws IOException { // create the ping command as a list of strings JavaPingExampleProgram ping = new JavaPingExampleProgram(); List<String> commands = new ArrayList<String>(); commands.add("ping"); commands.add("-c"); commands.add("5"); commands.add("74.125.236.73"); ping.doCommand(commands); } public void doCommand(List<String> command) throws IOException { String s = null; ProcessBuilder pb = new ProcessBuilder(command); Process process = pb.start(); BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream())); BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream())); // read the output from the command System.out.println("Here is the standard output of the command:\n"); while ((s = stdInput.readLine()) != null) { System.out.println(s); } // read any errors from the attempted command System.out.println("Here is the standard error of the command (if any):\n"); while ((s = stdError.readLine()) != null) { System.out.println(s); } } }
quelle
-c
zu-n
, am wahrscheinlichsten.ping
Befehl vom Betriebssystem ausgeführt.Mit dieser Methode können Sie Hosts unter Windows und anderen Plattformen anpingen:
private static boolean ping(String host) throws IOException, InterruptedException { boolean isWindows = System.getProperty("os.name").toLowerCase().contains("win"); ProcessBuilder processBuilder = new ProcessBuilder("ping", isWindows? "-n" : "-c", "1", host); Process proc = processBuilder.start(); int returnVal = proc.waitFor(); return returnVal == 0; }
quelle
kurze Empfehlung: Verwenden Sie nicht isReachable (), sondern rufen Sie den System-Ping auf, wie in einigen der obigen Antworten vorgeschlagen.
lange Erklärung:
quelle
Nur eine Ergänzung zu dem, was andere gegeben haben, obwohl sie gut funktionieren, aber in einigen Fällen, wenn das Internet langsam ist oder ein unbekanntes Netzwerkproblem vorliegt, funktionieren einige der Codes nicht (
isReachable()
). Dieser unten erwähnte Code erstellt jedoch einen Prozess, der als Befehlszeilen-Ping (cmd-Ping) für Windows fungiert. Es funktioniert bei mir in allen Fällen bewährt.Code: -
public class JavaPingApp { public static void runSystemCommand(String command) { try { Process p = Runtime.getRuntime().exec(command); BufferedReader inputStream = new BufferedReader( new InputStreamReader(p.getInputStream())); String s = ""; // reading output stream of the command while ((s = inputStream.readLine()) != null) { System.out.println(s); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String ip = "stackoverflow.com"; //Any IP Address on your network / Web runSystemCommand("ping " + ip); } }
Hoffe es hilft, Prost !!!
quelle
Obwohl dies nicht auf ICMP unter Windows beruht, funktioniert diese Implementierung mit der neuen Duration-API recht gut
public static Duration ping(String host) { Instant startTime = Instant.now(); try { InetAddress address = InetAddress.getByName(host); if (address.isReachable(1000)) { return Duration.between(startTime, Instant.now()); } } catch (IOException e) { // Host not available, nothing to do here } return Duration.ofDays(1); }
quelle
Unter Linux mit oracle-jdk verwendet der vom OP übermittelte Code Port 7, wenn nicht root, und ICMP, wenn root. Es führt eine echte ICMP-Echoanforderung aus, wenn es als Root ausgeführt wird, wie in der Dokumentation angegeben.
Wenn Sie dies auf einem MS-Computer ausführen, müssen Sie möglicherweise die App als Administrator ausführen, um das ICMP-Verhalten zu erhalten.
quelle
Hier ist eine Methode zum Pingen einer IP-Adresse
Java
, die aufWindows
und aufUnix
Systemen funktionieren sollte:import org.apache.commons.lang3.SystemUtils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class CommandLine { /** * @param ipAddress The internet protocol address to ping * @return True if the address is responsive, false otherwise */ public static boolean isReachable(String ipAddress) throws IOException { List<String> command = buildCommand(ipAddress); ProcessBuilder processBuilder = new ProcessBuilder(command); Process process = processBuilder.start(); try (BufferedReader standardOutput = new BufferedReader(new InputStreamReader(process.getInputStream()))) { String outputLine; while ((outputLine = standardOutput.readLine()) != null) { // Picks up Windows and Unix unreachable hosts if (outputLine.toLowerCase().contains("destination host unreachable")) { return false; } } } return true; } private static List<String> buildCommand(String ipAddress) { List<String> command = new ArrayList<>(); command.add("ping"); if (SystemUtils.IS_OS_WINDOWS) { command.add("-n"); } else if (SystemUtils.IS_OS_UNIX) { command.add("-c"); } else { throw new UnsupportedOperationException("Unsupported operating system"); } command.add("1"); command.add(ipAddress); return command; } }
Stellen Sie sicher, dass Sie
Apache Commons Lang
Ihre Abhängigkeiten hinzufügen .quelle
Ich weiß, dass dies mit früheren Einträgen beantwortet wurde, aber für alle anderen, die zu dieser Frage kommen, habe ich einen Weg gefunden, bei dem es nicht erforderlich war, den "Ping" -Prozess in Windows zu verwenden und dann die Ausgabe zu bereinigen.
Ich habe JNA verwendet, um die IP-Hilfsbibliothek von Window aufzurufen und ein ICMP-Echo zu erzeugen
Siehe meine eigene Antwort auf mein eigenes ähnliches Problem
quelle
InetAddress gibt nicht immer den richtigen Wert zurück. Dies ist im Fall eines lokalen Hosts erfolgreich, aber für andere Hosts zeigt dies, dass der Host nicht erreichbar ist. Versuchen Sie es mit dem unten angegebenen Ping-Befehl.
try { String cmd = "cmd /C ping -n 1 " + ip + " | find \"TTL\""; Process myProcess = Runtime.getRuntime().exec(cmd); myProcess.waitFor(); if(myProcess.exitValue() == 0) { return true; } else { return false; } } catch (Exception e) { e.printStackTrace(); return false; }
quelle
Ich habe ein paar Optionen ausprobiert:
InetAddress.getByName(ipAddress)
Das Netzwerk unter Windows begann sich nach einigen Versuchen schlecht zu benehmenJava HttpURLConnection
URL siteURL = new URL(url); connection = (HttpURLConnection) siteURL.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(pingTime); connection.connect(); code = connection.getResponseCode(); if (code == 200) { code = 200; }.
Das war zuverlässig, aber etwas langsam
Ich habe mich schließlich entschlossen, auf meinem Windows-Computer eine Batch-Datei mit folgendem Inhalt zu erstellen:
ping.exe -n %echoCount% %pingIp%
Dann habe ich die .bat-Datei in meinem Java-Code mit aufgerufenpublic int pingBat(Network network) { ProcessBuilder pb = new ProcessBuilder(pingBatLocation); Map<String, String> env = pb.environment(); env.put( "echoCount", noOfPings + ""); env.put( "pingIp", pingIp); File outputFile = new File(outputFileLocation); File errorFile = new File(errorFileLocation); pb.redirectOutput(outputFile); pb.redirectError(errorFile); Process process; try { process = pb.start(); process.waitFor(); String finalOutput = printFile(outputFile); if (finalOutput != null && finalOutput.toLowerCase().contains("reply from")) { return 200; } else { return 202; } } catch (IOException e) { log.debug(e.getMessage()); return 203; } catch (InterruptedException e) { log.debug(e.getMessage()); return 204; }
}}
Dies erwies sich als der schnellste und zuverlässigste Weg
quelle
Ich bevorzuge diesen Weg:
/** * * @param host * @return true means ping success,false means ping fail. * @throws IOException * @throws InterruptedException */ private static boolean ping(String host) throws IOException, InterruptedException { boolean isWindows = System.getProperty("os.name").toLowerCase().contains("win"); ProcessBuilder processBuilder = new ProcessBuilder("ping", isWindows? "-n" : "-c", "1", host); Process proc = processBuilder.start(); return proc.waitFor(200, TimeUnit.MILLISECONDS); }
Auf diese Weise kann die Blockierungszeit auf die bestimmte Zeit begrenzt werden, z. B. 200 ms.
Es funktioniert gut unter MacOS, Android und Windows, sollte aber in JDK 1.8 verwendet werden.
quelle
Das sollte funktionieren:
import java.io.BufferedReader; import java.io.InputStreamReader; public class Pinger { private static String keyWordTolookFor = "average"; public Pinger() { // TODO Auto-generated constructor stub } public static void main(String[] args) { //Test the ping method on Windows. System.out.println(ping("192.168.0.1")); } public String ping(String IP) { try { String line; Process p = Runtime.getRuntime().exec("ping -n 1 " + IP); BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); while (((line = input.readLine()) != null)) { if (line.toLowerCase().indexOf(keyWordTolookFor.toLowerCase()) != -1) { String delims = "[ ]+"; String[] tokens = line.split(delims); return tokens[tokens.length - 1]; } } input.close(); } catch (Exception err) { err.printStackTrace(); } return "Offline"; }
}}
quelle