Pregunta

Estoy desarrollando una aplicación que se conecta al servidor. Por ahora, el inicio de sesión y la transmisión de datos funciona 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 valor del archivo de configuración) // ya hecho
  2. boolean serverAvailable = (Compruebe si la dirección del servidor está disponible) // tiene que implementarse
  3. (Aquí viene la lógica que depende del servidor disponible)
¿Fue útil?

Solución

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)

Otros consejos

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 la 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 android.permission.ACCESS_NETWORK_STATE activado

¿Estás trabajando con HTTP? A continuación, puede 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;
 }
}

Oh, no, no, el código en Java no funciona: InetAddress.getByName (" fr.yahoo.com "). isReachable (200) aunque en 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();
Process proc = runtime.exec("ping fr.yahoo.com -c 1"); // other servers, for example
proc.waitFor();
int exit = proc.exitValue();
if (exit == 0) { // normal exit
    /* get output content of executing the ping command and parse it
     * to decide if the server is reachable
     */
} else { // abnormal exit, so decide that the server is not reachable
    ...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top