Cómo comprobar rápidamente si el servidor de URL está disponible

Tengo una URL en el formulario

http://www.mywebsite.com/util/conv?a=1&from=%s&to=%s 

Y quiero comprobar si está disponible.

Los enlaces me redireccionan en una página de solicitud incorrecta si intento abrirlos con un navegador, sin embargo a través del código puedo obtener los datos que necesito.

El uso de un bloque try-catch en un procedimiento de solicitud HTTP es bastante lento, así que me pregunto cómo podría hacer ping a una dirección similar para comprobar si su servidor está activo.


Yo he tratado

 boolean reachable = InetAddress.getByName(myLink).isReachable(6000); 

Pero las vueltas siempre son false .

También he intentado

 public static boolean exists(String URLName) { try { HttpURLConnection.setFollowRedirects(false); HttpURLConnection con = (HttpURLConnection) new URL(URLName).openConnection(); con.setConnectTimeout(1000); con.setReadTimeout(1000); con.setRequestMethod("HEAD"); return (con.getResponseCode() == HttpURLConnection.HTTP_OK); } catch (Exception e) { e.printStackTrace(); return false; } } 

Que devuelve el valor correcto al final del proceso, bit es demasiado lento si el servidor no está disponible.

EDITAR

He comprendido cuál es la causa de la lentitud

A) si el servidor devuelve algunos datos pero interrumpe la solicitud antes de completar la solicitud el tiempo de espera es ignorado y atascado hasta que devuelve una Exception que conduce la ejecución para alcanzar el bloque catch, esta es la causa de la lentitud de este método, No encontré una solución válida para evitar esto.

B) Si inicio el dispositivo android y abro la aplicación sin conexión, el valor falso se devuelve correctamente, si la aplicación se abre con conexión a Internet activa y el dispositivo pierde su conexión a Internet sucede lo mismo del caso A (también si me Tratar de terminar y reiniciar la aplicación … No sé por qué, supongo que algo se mantiene en caché)

Todo esto parece relacionado con el hecho de que Java URLConnection no proporciona ningún tiempo de espera a prueba de errores en lecturas. Mirando la muestra en este enlace he visto que utiliza un hilo para interrumpir la conexión de alguna manera pero si agrego simplemente la new Thread(new InterruptThread(Thread.currentThread(), con)).start(); línea new Thread(new InterruptThread(Thread.currentThread(), con)).start(); Como en la muestra nada cambia.

 static public boolean isServerReachable(Context context) { ConnectivityManager connMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = connMan.getActiveNetworkInfo(); if (netInfo != null && netInfo.isConnected()) { try { URL urlServer = new URL("your server url"); HttpURLConnection urlConn = (HttpURLConnection) urlServer.openConnection(); urlConn.setConnectTimeout(3000); //<- 3Seconds Timeout urlConn.connect(); if (urlConn.getResponseCode() == 200) { return true; } else { return false; } } catch (MalformedURLException e1) { return false; } catch (IOException e) { return false; } } return false; } 

O mediante el uso de tiempo de ejecución:

 Runtime runtime = Runtime.getRuntime(); Process proc = runtime.exec("ping www.serverURL.com"); //<- Try ping -c 1 www.serverURL.com int mPingResult = proc .waitFor(); if(mPingResult == 0){ return true; }else{ return false; } 

Usted puede intentar isReachable() pero hay un error archivado para él y este comentario dice que isReachable () requiere permiso de root :

 try { InetAddress.getByName("your server url").isReachable(2000); //Replace with your name return true; } catch (Exception e) { return false; } 
 public static boolean exists(String URLName) { try { HttpURLConnection.setFollowRedirects(false); // note : you may also need // HttpURLConnection.setInstanceFollowRedirects(false) HttpURLConnection con = (HttpURLConnection) new URL(URLName) .openConnection(); con.setRequestMethod("HEAD"); return (con.getResponseCode() == HttpURLConnection.HTTP_OK); } catch (Exception e) { e.printStackTrace(); return false; } } 

¿Ha intentado usar sockets sin procesar?

Debe correr más rápido, ya que está en una capa inferior

 static boolean exists(String serverUrl) { final Socket socket; try { URL url = new URL(serverUrl); socket = new Socket(url.getHost(), url.getPort()); } catch (IOException e) { return false; } try { socket.close(); } catch (IOException e) { // will never happen, it's thread-safe } return true; } 

Como se menciona por 'eridal', que debería ser más rápido, abra el zócalo; Sin embargo, sólo le dice que un servidor está escuchando en el host y el puerto, pero para estar seguro, necesita escribir HTTP o, alternativamente, una mala solicitud (basura), debe obtener HTTP / 1.1 400 Bad Request. Al leer la primera línea devuelta, si contiene HTTP, entonces está seguro de que el servidor es un servidor HTTP. De esta manera usted está seguro de que el servidor está disponible, así como un servidor HTTP.

Esto es en extensión a la respuesta anterior por eridal.

Prueba este código

 public boolean isServerAlive() // To check if server is reachable { try { InetAddress.getByName("google.com").isReachable(3000); //Replace with your name return true; } catch (Exception e) { return false; } } 

Debajo del código espera hasta que la página web esté disponible:

 public void waitForWebavailability() throws Exception { boolean success = false; long waitTime = 0; while (!success) { try { waitTest(30000); waitTime += 30000; if (waitTime > 600000) { System.out.println("Web page is not available"); } webDriver.get("http://www.google.com"); if (webDriver.getTitle().toLowerCase().contains("sometitle")) { success = true; } } catch (Exception e) { success = false; } } } // Code related to waittest public void waitTest(long millis) throws Exception { try { Thread.sleep(millis); } catch (InterruptedException e) { throw new Exception(e); } } 

Tuve un problema similar el mes pasado y alguien me ayudó con un ejemplo opcional. Me gustaría sugerirle lo mismo

 public boolean isServerReachable() // To check if server is reachable { try { InetAddress.getByName("google.com").isReachable(3000); //Replace with your name return true; } catch (Exception e) { return false; } } 

Si devuelve true que su servidor de URL está disponible, no está disponible actualmente.

 if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() .permitAll().build(); StrictMode.setThreadPolicy(policy); } try { URL diachi = new URL("http://example.com"); HttpURLConnection huc = (HttpURLConnection) diachi.openConnection(); huc.setRequestMethod("HEAD"); int responseCode = huc.getResponseCode(); if (responseCode != 404) { //URL Exist } else { //URL not Exist } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 
  • ¿Cómo puedo iterar a través de las propiedades id de la clase R.java?
  • IllegalStateException en Android Support al ejecutar pruebas de unidad
  • Android onConfigurationChanged () no se llama en Actividad
  • Cómo comprobar el doble valor está vacío o no
  • No se puede iniciar el temporizador en un servicio en android
  • ¿Por qué no puedo usar las anotaciones de Anulación en Android?
  • Hacer un mensaje Toast de un hilo independiente
  • Objeto de interfaz de usuario creado a través de XML no se está barajando en Android Marshmallow
  • Codificador y decodificador Base64
  • Programación Android de fondo de cultivo
  • Cómo evitar que aparezca automáticamente el teclado de Android cuando comience la actividad
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.