Question

Je développe une application qui se connecte au serveur. A présent, la connexion et la transmission des données fonctionnent correctement si le serveur est disponible. Le problème se pose lorsque le serveur est indisponible. Dans ce cas, la méthode envoie une demande de connexion et attend la réponse.

Quelqu'un sait-il comment vérifier si le serveur est disponible (visible)?

Le pseudocode de la logique simple à implémenter est le suivant:

  1. String serverAddress = (Lire la valeur du fichier de configuration) // déjà fait
  2. boolean serverAvailable = (Vérifiez si l'adresse serveur serverAddress est disponible) // doit être implémentée
  3. (Voici la logique qui dépend de serverAvailable)
Était-ce utile?

La solution

Il a probablement besoin de code Java car il travaille sur Android. L’équivalent Java - qui, à mon avis, fonctionne sur Android - devrait être:

InetAddress.getByName(host).isReachable(timeOut)

Autres conseils

Avec un simple test de type ping, cela fonctionnait pour moi:

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;
}

N'oubliez pas de lancer cette fonction dans un thread (pas dans le thread principal).

vous pouvez utiliser

InetAddress.getByName(host).isReachable(timeOut)

mais cela ne fonctionne pas bien lorsque l'hôte ne répond pas sur TCP 7. Vous pouvez vérifier si l'hôte est disponible sur ce port ce dont vous avez besoin à l'aide de cette fonction:

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;
}

essayez-le, travaillez pour moi et n'oubliez pas d'activer android.permission.ACCESS_NETWORK_STATE

Travaillez-vous avec HTTP? Vous pouvez ensuite définir un délai d’expiration sur votre connexion HTTP, en tant que tel:

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 vous exécutez ensuite une demande, vous obtiendrez une exception après le délai imparti.

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, non non, le code en Java ne fonctionne pas: InetAddress.getByName ("fr.yahoo.com"). isReachable (200) bien que dans LogCat, j'ai vu son adresse IP (identique avec 20000 ms de temps mort).

Il semble que l'utilisation de la commande "ping" soit pratique, par exemple:

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
    ...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top