Ver la Versión Completa : [ SOLUCIONADO ] Como comprobar que una web esta caída.
Me explico, tengo que recoger datos de una web, pero si esta web esta caida... ¿Como lo detecto? Por que se me "peta" la aplicación... tengo la función de si esta conectado el dispositivo a wifi o 3g.. pero claro.. si la web esta caída no se como controlarlo....
A lo mejor con un simple Try... Catch.. es suficiente, pero no se si hay otra forma
Saludos ;)
mocelet
31/05/13, 21:34:20
Si la web está caída pueden pasar varias cosas:
- Que el servidor no responda, te saltará un timeout en algún sitio, típicamente a los 30 segundos
- Que el servidor no esté disponible o a la web le pase algo, en cuyo caso recibirás mensajes HTTP del tipo 500, 404, etc... todo menos el 200 que es que el recurso está disponible y se va a entregar.
- Que la comunicación con el servidor tenga un problema de red, te saltará una IOException
Cuando una aplicación "peta" puedes saber perfectamente por qué y hasta qué línea del código es la que ha provocado que se cierre, acostúmbrate a mirar el LogCat.
Del try/catch no te libras en cualquier caso, pero también tendrás que ver el código de la respuesta (si es 200 o no)
kriogeN
31/05/13, 21:39:34
Si estás usando un HttpClient supongo que la respuesta de la web la guardarás en un HttpResponse.
En ese caso, con esto:
response.getStatusLine().getStatusCode()
Si el valor es distinto de 200, se ha producido un fallo.
En el caso de que el servidor no esté disponible se producirá una excepción por cumplirse el TimeOut, en ese caso necesitas el Try Catch (Java ya te obliga a usarlo si usas HttpClient.execute)
EDITO: Se adelantó mocelet.
Si la web está caída pueden pasar varias cosas:
- Que el servidor no responda, te saltará un timeout en algún sitio, típicamente a los 30 segundos
- Que el servidor no esté disponible o a la web le pase algo, en cuyo caso recibirás mensajes HTTP del tipo 500, 404, etc... todo menos el 200 que es que el recurso está disponible y se va a entregar.
- Que la comunicación con el servidor tenga un problema de red, te saltará una IOException
Cuando una aplicación "peta" puedes saber perfectamente por qué y hasta qué línea del código es la que ha provocado que se cierre, acostúmbrate a mirar el LogCat.
Del try/catch no te libras en cualquier caso, pero también tendrás que ver el código de la respuesta (si es 200 o no)
Si el LogCat lo miro siempre, pero esta vez no me mostro ningún error, solo que se detuvo y fallo el hilo...
Si estás usando un HttpClient supongo que la respuesta de la web la guardarás en un HttpResponse.
En ese caso, con esto:
response.getStatusLine().getStatusCode()
Si el valor es distinto de 200, se ha producido un fallo.
En el caso de que el servidor no esté disponible se producirá una excepción por cumplirse el TimeOut, en ese caso necesitas el Try Catch (Java ya te obliga a usarlo si usas HttpClient.execute)
EDITO: Se adelantó mocelet.
Creo que con el Try Catch es suficiente, de todas formas, voy ha hacer unas pruebas ;)
Lo de HttpRequest no lo utilizo, solo me conecto a la web para sacar los datos .xml que es como una API y conozco las rutas jejeje
Muchas Gracias chicos!!!!
David_91
05/06/13, 11:19:49
Que tipo de catch utilizaste para cuando el servidor no está enchufado? He probado con:
catch (ClientProtocolException e)
catch (IOException e)
Pero no me sigue petando la aplicación...
Que tipo de catch utilizaste para cuando el servidor no está enchufado? He probado con:
catch (ClientProtocolException e)
catch (IOException e)
Pero no me sigue petando la aplicación...
No entendi, con esos catch te sigue "petando" o ya no?
Pues lo he dejado en la cola de cosas que hacer, pero yo normalmente utilizo catch (Exception e) y no miro exactamente el tipo que son, salvo que me lo pida por defecto algún método...
Saludos.
kriogeN
05/06/13, 17:08:53
No entendi, con esos catch te sigue "petando" o ya no?
Pues lo he dejado en la cola de cosas que hacer, pero yo normalmente utilizo catch (Exception e) y no miro exactamente el tipo que son, salvo que me lo pida por defecto algún método...
Saludos.
Ya se lo he solucionado por privado, era porque no tenía establecidos los Timeout.
En cuanto a los Exception, yo también uso siempre Exception. Y aunque te lo pida algún método, también puedes quitar todos los que el método te sugiere y dejarlo sólo como Exception.
Y por último, es posible que aunque la conexión no se llegue a producir tampoco se produzca la excepción, y el getStatusCode() daría como resultado 0.
David_91
06/06/13, 09:01:45
Ya se lo he solucionado por privado, era porque no tenía establecidos los Timeout.
En cuanto a los Exception, yo también uso siempre Exception. Y aunque te lo pida algún método, también puedes quitar todos los que el método te sugiere y dejarlo sólo como Exception.
Y por último, es posible que aunque la conexión no se llegue a producir tampoco se produzca la excepción, y el getStatusCode() daría como resultado 0.
Como dice kriogeN el problema es que el timeout se tiraba no sé, quizas unos 5 minutos, por lo que Android me pedía forzar el cierre de la aplicación, pero si no lo forzaba en logcat después ya veía en que catch entraba, en el de IOException, el problema es que, como tardaba tanto en realizar el timeout, pues pensé que no funcionaba bien al no ver nada más por logcat después de entrar por el try
Gracias de nuevo kriogeN!
Hola,
finalmente como resolvistes el problema ? Yo ahora mismo me encuentro en la misma situación. Mi aplicación hace muchas consultas a un servidor web, y cuando este no responde se queda "colgada" 20 o 30 segundos hasta que recibe el error para tratarlo.
20 - 30 segundos por consulta es excesivo a mi parecer....
David_91
10/06/13, 10:49:38
public static int obtenerEstado() {
URI server = null;
try {
server = new URI("www.tuweb.com/archivo.php");
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, 10000);
HttpConnectionParams.setSoTimeout(params, 10000);
HttpClient httpclient = new DefaultHttpClient(params);
HttpGet httpRequest = new HttpGet(server);
try {
HttpResponse response = httpclient.execute(httpRequest);
return response.getStatusLine().getStatusCode();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
Log.e("Catch", "ClientProtocolException");
return -1;
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e("Catch", "IOException");
return -1;
}
}
Yo hice este método, en caso de que salga por un catch devuelvo -1 y ya lo trato donde sea necesario, en caso de ser try, devuelve el statusCode (El que te de el servidor web al que conectes) Con un timeout de 10 segundos, aun así, como comentaba en otro hilo, sigo teniendo un problema, en mi caso, esto se ejecuta en un AsyncTask, y si el servidor está caído o directamente no hay servidor, los 10 segundos del timeout la aplicación se queda congelada a pesar de que, tiene puesto una barra de progreso en el onPreExecute, supongo que será un fallo de Android, pero aquí nadie sabe resolverlo por desgracia :(
Espero haberte ayudado!
Gracias por responder.
Mi problema estaba que yo no ajustaba los Timeout, ahora dejandolos a 5 segundos es más que suficiente para mi servidor.
El tema de que comentas que sigue dando error, yo he echo lo siguiente que igual te sirve.
El codigo codigo que me procesa el estado del servidor lo tengo en una clase. Dentro del AsyncTask creo un objeto de esta clase al que le paso como String una URL del servidor que quiero comprobar. Al crearse el objeto almaceno en una variable si el estado del servidor es TRUE o FALSE y lo obtengo con un simple metodo accesor.
En mi caso la clase que procesa el estado del servidor trata por igual todos los estados que no sean 202.
Yo de esta manera he solucionado los tiempos de carga cuando el servidor no responde, y me funciona perfectamente dentro del AsysncTask.
un saludo !
vBulletin® v3.8.1, Copyright ©2000-2026, Jelsoft Enterprises Ltd.