Android: ¿Cómo verificar si el servidor está disponible?

Estoy desarrollando una aplicación que se conecta al servidor. Por ahora, el inicio de sesión y la transmisión de datos funcionan bien si el servidor está disponible. El problema surge cuando el servidor no está disponible. En este caso, el método envía una solicitud de inicio de sesión y espera la respuesta.

¿Alguien sabe cómo verificar si el servidor está disponible (visible)?

El pseudocódigo de la lógica simple que debe implementarse es el siguiente:

  1. String serverAddress = (Leer el valor del archivo de configuración) // ya está hecho
  2. boolean serverAvailable = (Compruebe si el servidor serverAddress está disponible) // tiene que implementarse
  3. (Aquí viene la lógica que depende de serverAvailable)

Probablemente necesite código Java ya que está trabajando en Android. El equivalente de Java, que creo que funciona en Android, debería ser:

InetAddress.getByName(host).isReachable(timeOut) 

Con una simple prueba de ping, esto funcionó para mí:

 static public boolean isURLReachable(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); if (netInfo != null && netInfo.isConnected()) { try { URL url = new URL("http://192.168.1.13"); // Change to "http://google.com" for www test. HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); urlc.setConnectTimeout(10 * 1000); // 10 s. urlc.connect(); if (urlc.getResponseCode() == 200) { // 200 = "OK" code (http connection is fine). Log.wtf("Connection", "Success !"); return true; } else { return false; } } catch (MalformedURLException e1) { return false; } catch (IOException e) { return false; } } return false; } 

No olvide ejecutar esta función en un hilo (no en el hilo principal).

puedes usar

 InetAddress.getByName(host).isReachable(timeOut) 

pero no funciona bien cuando el host no responde en tcp 7. Puede verificar si el host está disponible en ese puerto lo que necesita con ayuda de esta función:

 public static boolean isHostReachable(String serverAddress, int serverTCPport, int timeoutMS){ boolean connected = false; Socket socket; try { socket = new Socket(); SocketAddress socketAddress = new InetSocketAddress(serverAddress, serverTCPport); socket.connect(socketAddress, timeoutMS); if (socket.isConnected()) { connected = true; socket.close(); } } catch (IOException e) { e.printStackTrace(); } finally { socket = null; } return connected; } 
 public static boolean IsReachable(Context context) { // First, check we have any sort of connectivity final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); final NetworkInfo netInfo = connMgr.getActiveNetworkInfo(); boolean isReachable = false; if (netInfo != null && netInfo.isConnected()) { // Some sort of connection is open, check if server is reachable try { URL url = new URL("http://www.google.com"); //URL url = new URL("http://10.0.2.2"); HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); urlc.setRequestProperty("User-Agent", "Android Application"); urlc.setRequestProperty("Connection", "close"); urlc.setConnectTimeout(10 * 1000); urlc.connect(); isReachable = (urlc.getResponseCode() == 200); } catch (IOException e) { //Log.e(TAG, e.getMessage()); } } return isReachable; } 

pruébalo, trabaja para mí y no olvides activar android.permission.ACCESS_NETWORK_STATE

¿Estás trabajando con HTTP? Luego, podría establecer un tiempo de espera en su conexión HTTP, como tal:

 private void setupHttpClient() { BasicHttpParams httpParams = new BasicHttpParams(); ConnManagerParams.setTimeout(httpParams, CONNECTION_TIMEOUT); //... ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager( httpParams, schemeRegistry); this.httpClient = new DefaultHttpClient(cm, httpParams); } 

Si luego ejecuta una solicitud, obtendrá una excepción después del tiempo de espera dado.

 public boolean isConnectedToServer(String url, int timeout) { try{ URL myUrl = new URL(url); URLConnection connection = myUrl.openConnection(); connection.setConnectTimeout(timeout); connection.connect(); return true; } catch (Exception e) { // Handle your exceptions return false; } } 

Ah, no no, el código en Java no funciona: InetAddress.getByName (“fr.yahoo.com”). IsReachable (200) aunque en el LogCat vi su dirección IP (lo mismo con 20000 ms de tiempo de espera) .

Parece que el uso del comando ‘ping’ es conveniente, por ejemplo:

 Runtime runtime = Runtime.getRuntime ();
 Proceso proc = runtime.exec ("ping fr.yahoo.com -c 1");  // otros servidores, por ejemplo
 proc.waitFor ();
 int exit = proc.exitValue ();
 if (exit == 0) {// salida normal
     / * obtiene el contenido de salida de ejecutar el comando ping y lo analiza
      * para decidir si el servidor es alcanzable
      * /
 } else {// salida anormal, por lo que decide que el servidor no es alcanzable
     ...
 }