wake-up-neo.net

So senden Sie eine IP-Adresse per Ping

Ich benutze diesen Teil des Codes, um eine IP-Adresse in Java zu pingen, aber nur das Pinging 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-Anforderung an 127.0.0.1
Gastgeber ist erreichbar
Senden einer Ping-Anforderung an 173.194.32.38
Gastgeber ist NICHT erreichbar

66
Mehdi

Sie können nicht einfach in Java pingen, da es auf ICMP basiert, was in Java leider nicht unterstützt wird 

http://mindprod.com/jgloss/ping.html

Verwenden Sie stattdessen Steckdosen

Ich hoffe es hilft

12
aretai

InetAddress.isReachable() nach javadoc :

".. Eine typische Implementierung verwendet ICMP ECHO REQUESTs, wenn das Privileg .__ erhalten werden kann. Andernfalls wird versucht, eine TCP Verbindung an Port 7 (Echo) des Zielhosts herzustellen.

Option 1 (ICMP) erfordert in der Regel administrative (root)-Rechte. 

56
Arvik

Ich denke, dieser Code wird dir 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();
        }
    }
}
24

Überprüfen Sie Ihre Konnektivität. Auf meinem Computer werden REACHABLE für beide IPs gedruckt:

Senden einer Ping-Anforderung an 127.0.0.1
Gastgeber ist erreichbar
Senden einer Ping-Anforderung an 173.194.32.38
Gastgeber ist erreichbar

BEARBEITEN:

Sie könnten versuchen, den Code zu ändern, um die Adresse mithilfe von getByAddress () 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 getByName () -Methoden versuchen möglicherweise eine Art umgekehrter DNS-Suche, die auf Ihrem Computer möglicherweise nicht möglich ist.

18
Durandal

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

}
12
gYanI

Sie können diese Methode verwenden, um Hosts unter Windows oder anderen Plattformen zu pingen: 

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


Nur eine Ergänzung zu dem, was andere gegeben haben, auch wenn sie gut funktionieren, aber Wenn das Internet langsam ist oder ein unbekanntes Netzwerkproblem vorliegt, funktionieren einige Codes nicht (isReachable()). Aber dieser Code erzeugt einen Prozess, der als Befehlszeilen-Ping (Cmd-Ping) für Fenster 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);
}
}

Ich hoffe es hilft, Prost !!!

3
mustangDC

Auch wenn dies unter Windows nicht von ICMP abhängig ist, funktioniert diese Implementierung mit der neuen Duration-API ziemlich 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);
}
2
Jerome

Hier ist eine Methode zum Pingen einer IP-Adresse in Java, die auf Windows- und Unix-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 zu Ihren Abhängigkeiten hinzufügen.

1
BullyWiiPlaza

Bei Linux mit Oracle-jdk verwendet der übergebene Code den Port 7 (nicht root) und ICMP (root). Es führt eine echte ICMP-Echoanforderung aus, wenn es gemäß der Dokumentation als root ausgeführt wird.

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.

1
user176495

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.

Was ich getan habe, war die Verwendung von JNA, um die IP-Hilfsbibliothek von Windows aufzurufen, um ein ICMP-Echo auszuführen

Siehe meine eigene Antwort auf meine eigene ähnliche Ausgabe

0
Jgregoire108

Ich habe ein paar Optionen ausprobiert:

  1. Java InetAddress

InetAddress.getByName(ipAddress), das Netzwerk unter Windows hat sich nach ein paar Versuchen nicht mehr richtig verhalten

  1. Java 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;
            }.
    

Dies war zuverlässig, aber etwas langsam

  1. Windows-Batchdatei

Schließlich habe ich mich 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 aufgerufen

public 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

0
Felix Oriedo

InetAddress liefert nicht immer einen korrekten Wert. Bei einem lokalen Host ist dies erfolgreich, bei anderen Hosts ist dies jedoch nicht erreichbar. Versuchen Sie, den Ping-Befehl wie unten angegeben zu verwenden.

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