networking sunny - Android:Wie überprüft man, ob der Server verfügbar ist?




download installation (7)

Ich entwickle eine Anwendung, die mit dem Server verbindet. Die Anmeldung und Datenübertragung funktioniert jetzt einwandfrei, wenn der Server verfügbar ist. Das Problem tritt auf, wenn der Server nicht verfügbar ist. In diesem Fall sendet die Methode eine Anmeldeanforderung und wartet auf die Antwort.

Kann jemand überprüfen, ob der Server verfügbar (sichtbar) ist?

Der Pseudocode der einfachen Logik, die implementiert werden muss, ist der folgende:

  1. String serverAddress = (Wert aus der Konfigurationsdatei lesen) // bereits erledigt
  2. boolean serverAvailable = (Überprüfen Sie, ob die Server-Serveradresse verfügbar ist) // muss implementiert werden
  3. (Hier kommt die Logik, die von serverAvailable abhängt)

Answers

Mit einem einfachen Ping-ähnlichen Test funktionierte das für mich:

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

Vergessen Sie nicht, diese Funktion in einem Thread (nicht im Hauptthread) auszuführen.


Arbeiten Sie mit HTTP? Sie könnten dann eine Zeitüberschreitung für Ihre HTTP-Verbindung festlegen:

private void setupHttpClient() {
    BasicHttpParams httpParams = new BasicHttpParams();

    ConnManagerParams.setTimeout(httpParams, CONNECTION_TIMEOUT);
    //...

    ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(
            httpParams, schemeRegistry);
    this.httpClient = new DefaultHttpClient(cm, httpParams);
}

Wenn Sie dann eine Anfrage ausführen, erhalten Sie nach dem angegebenen Timeout eine Ausnahme.


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

versuch es, arbeite für mich und vergiss actived android.permission.ACCESS_NETWORK_STATE nicht


Oh, nein nein, der Code in Java funktioniert nicht: InetAddress.getByName ("fr.yahoo.com"). IsReachable (200) obwohl ich im LogCat seine IP-Adresse gesehen habe (das gleiche mit 20000 ms Timeout) .

Es scheint, dass die Verwendung des Befehls 'ping' praktisch ist, zum Beispiel:

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

Er benötigt wahrscheinlich Java-Code, da er an Android arbeitet. Das Java-Äquivalent - was meiner Meinung nach unter Android funktioniert - sollte wie folgt aussehen:

InetAddress.getByName(host).isReachable(timeOut)

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

Der in Ihrer (alten) Version von Eclipse enthaltene Emulator ist sehr langsam.

Neuere Emulatoren sind schneller als 2010. Aktualisieren Sie Ihr SDK / IDE.

Ich persönlich benutze ein echtes Telefon, um meine Tests durchzuführen. Es ist schneller und Tests sind realistischer. Wenn Sie Ihre Anwendung jedoch auf vielen verschiedenen Android-Versionen testen möchten und nicht mehrere Telefone kaufen möchten, müssen Sie den Emulator von Zeit zu Zeit verwenden.





android networking connectivity