una servidor responde por pero otra nombre hago hacer como java ping host

java - servidor - Cómo hacer ping a una dirección IP



ping java netbeans (12)

Aquí hay un método para hacer ping a una dirección IP en Java que debería funcionar en Windows y Unix :

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

Asegúrese de agregar Apache Commons Lang a sus dependencias.

Estoy usando esta parte del código para hacer ping a una dirección IP en Java, pero solo el ping localhost es exitoso y para los otros hosts el programa dice que el host no está disponible. Inhabilité mi firewall pero aún tengo este problema

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

El resultado es:

Envío de solicitud de ping a 127.0.0.1
El anfitrión es alcanzable
Envío de Solicitud de Ping a 173.194.32.38
El anfitrión NO es alcanzable


Creo que este código te ayudará a:

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


En Linux con Oracle-jdk, el código que OP envió utiliza el puerto 7 cuando no es root y ICMP cuando es root. Realiza una solicitud real de eco ICMP cuando se ejecuta como root como especifica la documentación.

Si ejecuta esto en una máquina MS, es posible que deba ejecutar la aplicación como administrador para obtener el comportamiento de ICMP.


Esto debería funcionar:

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

}


Funcionará seguro

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


InetAddress no siempre devuelve el valor correcto. Es exitoso en el caso de Local Host pero para otros hosts esto muestra que el host es inalcanzable. Intente utilizar el comando ping como se indica a continuación.

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


No se puede simplemente hacer ping en Java ya que depende de ICMP, que lamentablemente no es compatible con Java

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

Use enchufes en su lugar

Espero eso ayude


Puede usar este método para hacer ping a los hosts en Windows u otras plataformas:

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


Sé que esto ha sido respondido con entradas previas, pero para cualquier otra persona que llegue a esta pregunta, encontré una forma que no requería usar el proceso "ping" en Windows y luego restregar la salida.

Lo que hice fue usar JNA para invocar a la biblioteca auxiliar de Windows de Window para hacer un eco ICMP

Ver mi propia respuesta a mi problema similar


Verifica tu conectividad En mi computadora esto imprime REACHABLE para ambas IP:

Envío de solicitud de ping a 127.0.0.1
El anfitrión es alcanzable
Envío de Solicitud de Ping a 173.194.32.38
El anfitrión es alcanzable

EDITAR:

Puede intentar modificar el código para usar getByAddress () para obtener la dirección:

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

Los métodos getByName () pueden intentar algún tipo de búsqueda DNS inversa que puede no ser posible en su máquina, getByAddress () podría omitir eso.


InetAddress.isReachable() según javadoc :

"... Una implementación típica usará PETICIONES DE ECO de ICMP si se puede obtener el privilegio; de lo contrario, intentará establecer una conexión TCP en el puerto 7 (Eco) del host de destino ...".

La opción n. ° 1 (ICMP) generalmente requiere derechos administrativos (root) .



Solo una adición a lo que otros han dado, a pesar de que funcionan bien, pero en algunos casos si Internet es lento o existe algún problema de red desconocido, algunos de los códigos no funcionarán ( isReachable() ). Pero este código mencionado a continuación crea un proceso que actúa como un ping de línea de comando (cmd ping) para Windows. Funciona para mí en todos los casos, probado y probado.

Código: -

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 = ".com"; //Any IP Address on your network / Web runSystemCommand("ping " + ip); } }

Espero que ayude, ¡Saludos!