Frage

Ich entwickle eine Anwendung, die mit dem Server verbindet. Inzwischen wird die Anmeldung und Datenübertragung funktioniert gut, wenn theserver verfügbar ist. Das Problem tritt auf, wenn der Server nicht verfügbar ist. In diesem Fall sendet das Verfahren eine Anmeldeanforderung und wartet auf die Antwort.

Wer weiß, wie zu überprüfen, ob der Server verfügbar ist (sichtbar)?

Der Pseudo-Code der einfachen Logik, die implementiert werden muss, ist die folgende:

  1. String server = (Lesen Wert aus der Konfigurationsdatei) // bereits getan
  2. boolean serverAvailable = (Überprüfen Sie, ob der Server server verfügbar ist) // implementiert werden
  3. (Hier kommt die Logik, die auf serverAvailable abhängt)
War es hilfreich?

Lösung

Er braucht wahrscheinlich Java-Code, da er auf Android arbeitet. Die äquivalente Java - was ich Arbeiten auf Android glauben - sein sollte:

InetAddress.getByName(host).isReachable(timeOut)

Andere Tipps

Mit einem einfachen Ping-Test wie dies funktionierte 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 Gewinde (nicht im Hauptthread) ausgeführt werden.

Sie verwenden können,

InetAddress.getByName(host).isReachable(timeOut)

aber es funktioniert nicht gut funktionieren, wenn der Host auf tcp zu beantworten ist nicht 7. Sie überprüfen können, ob der Host auf dem Port verfügbar ist, was Sie mit Hilfe dieser Funktion müssen:

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

versuchen Sie es, Arbeit für mich und nicht vergessen actived android.permission.ACCESS_NETWORK_STATE

Arbeiten Sie mit HTTP? Sie könnten dann einen Timeout auf Ihrer HTTP-Verbindung gesetzt, wie zum Beispiel:

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 Anforderung ausführen, erhalten Sie eine Ausnahme nach der angegebenen Timeout erhalten.

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, nein, nein, der Code in Java nicht funktioniert: InetAddress.getByName ( "fr.yahoo.com") isReachable (200), obwohl in dem LogCat ich seine IP-Adresse sah (das gleiche mit 20000 ms. Time out).

Es scheint, dass die Verwendung des Befehls ‚Ping‘ ist bequem, 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
    ...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top