[Métodos] Como verificar que exista una conexión a internet desde Java

Cómo verificar que exista una conexión a internet desde Java




Para verificar que exista una conexión a internet con java, existen 3 enfoques:


  • No comprobar nada
  • Conectar a algun sitio con java.net.InetAddress
  • Utilizar java.lang.Process para hacer un ping



No hacer nada



Asi es, ¿para qué comprobamos que exista un conexión a internet?

Para evitar ejecutar un proceso que requiera del acceso a internet cuando no está disponible. Pero todo método de conexión a la red lanzará una exception de entrada/salida cuando esto no sea posible, teniendo que ser concientes ubicar la lógica en procesos de reconexión. De lo contrario estariamos testeando gratuitamente el acceso a los servidores de google o algun otro sitio irrelevante, sin asegurar que la conexión a la cual queremos acceder siga sin estar disponibles.

Si el sitio al que queremos acceder podemos tener el control, es aceptable enviar un pequeño resquest a un endpoint que devuelve una sencilla respuesta para garantizar que la comunicación es posible, al estilo 'ping'-'pong'




InetAddress.isReachable()



InetAddress representa una dirección de protocolo de internet (Internet Protocol o IP), se instancia a través de la su método éstatico InetAddress.getByName(String host), pasando en el string de parámetro una ip.

El método de interés es isReachable(int timeout), el cuál recibe un tiempo de espera para determinar si es posible conectarse a el sitio especificado en la instancia.


     public static void sendPingRequest(String ipAddress) throws IOException {
        imprimir("Enviando solicitud Ping a: " + ipAddress);
        InetAddress inetAddress = InetAddress.getByName(ipAddress);

        if (inetAddress.isReachable(5000)) {
            System.out.println("El destino es alcanzable");
            System.out.println("Canonical HostName: " + inetAddress.getCanonicalHostName());
            System.out.println("HostName: " + inetAddress.getHostName());
            System.out.println(inetAddress.toString());
        } else {
            System.out.println("No se pudo alcanzar este sitio!");
        }
    }
 

Ejecutando este método con localhost '127.0.0.1', la ip de google argentina '172.217.162.3' y esta la invertimos un poco '172.162.217.30'


Sending Ping Request to 127.0.0.1
Host is reachable
Canonical HostName: 127.0.0.1
HostName: 127.0.0.1
127.0.0.1/127.0.0.1



java.lang.Process



Process representa un proceso nativo del sistema instanciada por ProccessBuilder que recibe como argunmentos en su constructor una lista de String siendo cada uno de ellos una instrucción a ejecutar, muy similar a ejecutar un linea de comandos.


    public static void commands(String ipAddress) throws IOException {
        List<String> commandList = new ArrayList<>();
        commandList.add("ping");
        commandList.add(ipAddress);

        ProcessBuilder build = new ProcessBuilder(commandList);
        Process process = build.start();

        InputStream isin = process.getInputStream();
        Reader readerIsin = new InputStreamReader(isin);
        BufferedReader input = new BufferedReader(readerIsin);
        InputStream iser = process.getInputStream();
        Reader readerIser = new InputStreamReader(iser);
        BufferedReader error = new BufferedReader(readerIser);
        String s = null;

        System.out.println("Standard output: ");
        while ((s = input.readLine()) != null) {
            System.out.println(s);
        }

        if((s = error.readLine()) != null) {
            System.out.println("Errors output: ");
            do {
                System.out.println(s);
            } while ((s = error.readLine()) != null);
        }
    }
 

Standard output:

Haciendo ping a 127.0.0.1 con 32 bytes de datos:
Respuesta desde 127.0.0.1: bytes=32 tiempo<1m TTL=128
Respuesta desde 127.0.0.1: bytes=32 tiempo<1m TTL=128
Respuesta desde 127.0.0.1: bytes=32 tiempo<1m TTL=128
Respuesta desde 127.0.0.1: bytes=32 tiempo<1m TTL=128

Estad¡sticas de ping para 127.0.0.1:
Paquetes: enviados = 4, recibidos = 4, perdidos = 0
(0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
M¡nimo = 0ms, M ximo = 0ms, Media = 0ms

No hay comentarios:

Publicar un comentario