web-dev-qa-db-fra.com

Android: comment vérifier si le serveur est disponible?

Je développe une application qui se connecte au serveur. À présent, la connexion et la transmission de données fonctionnent correctement si le serveur est disponible. Le problème survient lorsque le serveur n'est pas disponible. 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 à mettre en œuvre est le suivant:

  1. String serverAddress = (Lire la valeur du fichier de configuration) // déjà fait
  2. boolean serverAvailable = (Vérifier si le serveur serverAddress est disponible) // doit être implémenté
  3. (Voici la logique qui dépend du serveurDisponible)
36
Niko Gamulin

Il a probablement besoin de Java code car il travaille sur Android. L'équivalent Java - qui je crois fonctionne sur Android - - devrait être:

InetAddress.getByName(Host).isReachable(timeOut)
49
Sean Owen

Avec un simple test de type ping, cela a fonctionné 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 d'exécuter cette fonction dans un thread (pas dans le thread principal).

19
Gauthier Boaglio

vous pouvez utiliser

InetAddress.getByName(Host).isReachable(timeOut)

mais cela ne fonctionne pas correctement 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;
}
5
adudakov
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 Android.permission.ACCESS_NETWORK_STATE activé

3
Dwi NetraliZme
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;
 }
}
2
Iman Marashi

Travaillez-vous avec HTTP? Vous pouvez ensuite définir un délai d'expiration sur votre connexion HTTP, comme suit:

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.

2
Matthias

Oh, non non, le code dans Java ne fonctionne pas: InetAddress.getByName ("fr.yahoo.com"). IsReachable (200) bien que dans le LogCat j'ai vu son adresse IP ( idem avec 20000 ms de time out).

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"); // autres serveurs, par exemple 
 proc.waitFor (); 
 int exit = proc.exitValue (); 
 if (exit == 0) {// exit normal 
/* obtenir le contenu de sortie de l'exécution de la commande ping et l'analyser 
 * pour décider si le serveur est accessible 
 */
} else {// sortie anormale, décidez donc que le serveur n'est pas accessible 
 ... 
} 
0
kinhnc