java - para - manual de programacion android pdf
Cómo comprobar rápidamente si el servidor de URL está disponible (9)
¿Has intentado usar sockets en bruto?
Debería 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;
}
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, por lo que me pregunto cómo podría hacer ping a una dirección similar para verificar si su servidor está activo.
Yo he tratado
boolean reachable = InetAddress.getByName(myLink).isReachable(6000);
Pero devuelve siempre false
.
Tambien lo 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;
}
}
Eso devuelve el valor correcto al final del proceso, el bit es demasiado lento si el servidor no está disponible.
EDITAR
He entendido cual 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 se ignora y se atasca hasta que se devuelve una Exception
que hace que la ejecución llegue al bloque catch, esta es la causa de la lentitud de este método, y todavía no tengo 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, ocurre lo mismo que en el caso A (también si I intente terminar y reiniciar la aplicación ... No sé por qué, supongo que algo permanece en caché)
Todo esto parece estar relacionado con el hecho de que Java URLConnection
no proporciona ningún tiempo de espera de seguridad en las 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 línea new Thread(new InterruptThread(Thread.currentThread(), con)).start();
Como en la muestra nada cambia.
A continuación el 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);
}
}
Como se menciona por ''eridal'', eso debería ser más rápido, abra el zócalo; sin embargo, solo le dice que un servidor está escuchando en el host y el puerto, pero para estar seguro, necesita escribir HTTP o, alternativamente, una solicitud incorrecta (no deseado), debe obtener HTTP / 1.1 400 Bad Request. Al leer la primera línea devuelta, si contiene HTTP, está seguro de que el servidor es un servidor HTTP. De esta manera, 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 codigo
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;
}
}
Tuve un problema similar el mes pasado y alguien me ayudó con un ejemplo opcional. Me gustaría sugerirte 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 la devolución es verdadera, su servidor url está disponible, de lo contrario no estará disponible actualmente.
here el escritor sugiere esto:
public boolean isOnline() {
Runtime runtime = Runtime.getRuntime();
try {
Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
int exitValue = ipProcess.waitFor();
return (exitValue == 0);
} catch (IOException | InterruptedException e) { e.printStackTrace(); }
return false;
}
¿No podría simplemente hacer ping a mi propia página, que quiero solicitar de todos modos? ¡Claro! Incluso podría marcar ambos, si desea diferenciar entre “conexión a internet disponible” y que sus propios servidores sean accesibles.
lee el enlace suena muy bien
EDITAR: en mi exp de usarlo, no es tan rápido como este método:
public boolean isOnline() {
NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnectedOrConnecting();
}
son un poco diferentes, pero en la funcionalidad para solo verificar la conexión a Internet, el primer método puede ser lento debido a las variables de conexión.
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();
}
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;
}
}
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 utilizando el 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;
}
Puedes probar isReachable()
pero hay un error archivado 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;
}