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.
- Cómo hacer frente a una imagen que está en el recurso del sistema en android
- Desplazamiento de una vista por código
- ¿Qué es una buena manera de almacenar un objeto de ubicación?
- ¿Dónde detener / destruir subprocesos en la clase de servicio de Android?
- Reino: se cambió el orden de los registros
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.
- Después de la actualización de Google Play Service a la versión 13, recibí un error
- Cargar y mostrar un documento de palabra de MS en Android
- ¿Cómo se pueden manejar múltiples solicitudes para llenar modelos con RXJava Observables?
- Recoger el sensor android durante un período específico y calcular el promedio
- Java.io.NotSerializableException incluso si implemento "Serializable"
- Cómo hacer una relación bidireccional uno-a-uno por GreenDAO?
- ¿Cómo puedo separar los metadatos y la pista de un flujo de shoutcast sin realizar solicitudes separadas de metadatos y el streaming
- Relación uno-a-muchos en ORMLite Android
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(); }
- Llamada del widget de búsqueda OnNewIntent dos veces
- La capa de interfaz de radio de Android (RIL) y / dev /