Foro de elhacker.net

Programación => Java => Mensaje iniciado por: juancaa en 9 Julio 2012, 11:07 am



Título: Comprobar conexion en Java (ping)
Publicado por: juancaa en 9 Julio 2012, 11:07 am
Buenas! Estoy desarrollando una pequeña aplicacion que entre otras cosas comprueba el estado de la conexion, lo mas sencillo que se me ocurre es realizar un ping a "www.google.com" pero por lo visto java no realiza pings, por lo que recurri al metodo "isReachable()" pero este, por lo que parece tansolo es capaz de encontrar el host dentro de una red local, no en la red externa.

Este es el codigo que actualmente estoy utilizando:
Código
  1.        String conStatus = null;
  2.        try {
  3.            int timeOut = 2000;
  4.            String host= "http://www.google.es/";
  5.            InetAddress address = InetAddress.getByName(host);
  6.            if (address.isReachable(timeOut))
  7.                conStatus = "Online";
  8.            else conStatus = "Still Offline";
  9.        } catch (Exception e) { }
  10.        return conStatus;
  11.  

Y tal como he dicho, no funciona para redes externas con lo que no se como hallar el estado de la conexion. Alguna idea??
Gracias de antemano!!


Título: Re: Comprobar conexion en Java (ping)
Publicado por: adastra en 9 Julio 2012, 12:20 pm
Cuando realizas conexiones HTTP/HTTPS desde Java, debes utilizas las clases HttpUrlConnection y HttpsUrlConnection, ambas son hijas de la clase URLConnection.
En esas clases, esta la clave para lo que quieres hacer.


Título: Re: Comprobar conexion en Java (ping)
Publicado por: juancaa en 11 Julio 2012, 15:01 pm
Esta es la solución a la que he llegado :

Código:
    private String getConnectionStatus () {
        String conStatus = null;
        try {
            URL u = new URL("https://www.google.es/");
            HttpsURLConnection huc = (HttpsURLConnection) u.openConnection();
            huc.connect();
            conStatus = "Online";
        } catch (Exception e) {
            conStatus = "Offline";
        }       
        return conStatus;
    }

Este codigo lo que hace es intentar conectar a la direccion "u" y, si es posible actualiza el valor de conStatus a "Online" y si no es posible tira una excepcion, la cual recojo y actualizo el valor de conStatus a "Offline"...

Es esta la idea ? Es optimizable el codigo ??


Título: Re: Comprobar conexion en Java (ping)
Publicado por: adastra en 11 Julio 2012, 18:40 pm
 jejeje, si y no.
Fijate en la excepción que se lanza cuando intentes realizar una conexión por HTTPS...
Debes implementar los métodos necesarios para tratar los los certificados que emite el servidor y definir cuales son confiables y cuales no. Si ese tratamiento no es implementado, tu programa en Java siempre te dará una excepción porque no confía en ninguno de los certificados que envía el servidor para establecer una conexión SSL.
Por otro lado, el hecho de que haya conectividad por significa que el servicio este disponible, la respuesta perfectamente puede ser un error HTTP 3XX, 4XX o 5XX, podrás garantizar que el servidor esta activo (y que tienes acceso al recurso o página que solicites) si y solo si, el código HTTP retornado por el servidor es 2XX


Esto es un fragmento de código de un proyecto que tengo en Java que establece una conexión HTTP/HTTPS, es más o menos lo que necesitas (en este caso sin validar los certificados aceptables, por defecto todos son admitidos, desde el punto de vista de la seguridad esto se puede dar para ataques MITM, así que no es código para poner en un entorno productivo).


Código:
[pre]if(isUseSSL()) { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, new TrustManager[]{ new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { } public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { } } }, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier( new HostnameVerifier() { public boolean verify(String string,SSLSession ssls) { return true; } }); setUrlService(new URL("https",getHostService(),getPortService(),pathService)); } else { setUrlService(new URL("http",getHostService(),getPortService(),pathService)); } if(getUrlService() != null) { setUrlConnection(getUrlService().openConnection()); } if(getUrlConnection() != null) { getUrlConnection().setDoOutput(true); getUrlConnection().setDoInput(true); getUrlConnection().setUseCaches(false); getUrlConnection().setRequestProperty("Content-Type", contentType); getUrlConnection().setReadTimeout(5000); return true; [/pre][pre] } [/pre][pre]
[/pre][pre]
[/pre][pre]
[/pre][pre]
[/pre][pre]
[/pre][pre]
[/pre][pre][pre] /** * Getter of this property. * @return the urlConnection */ public URLConnection getUrlConnection() { return urlConnection; } /** * Setter of this property * @param urlConnection the urlConnection to set */ public void setUrlConnection(URLConnection urlConnection) { this.urlConnection = urlConnection; }[/pre][/pre]