2009-09-18 13 views
34

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.Android: Wie überprüft man, ob der Server verfügbar ist?

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

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 muss
  3. (Hier kommt die Logik, die auf serverAvailable abhängt)
+0

können Sie sehen: http://Stackoverflow.com/a/18845416 für eine nette Möglichkeit, das zu tun. (hat mir geholfen :)) – yossico

Antwort

45

er wahrscheinlich Java-Code benötigt, da er Arbeitso n Android. Die Java-Entsprechung - die ich glaube, dass Android funktioniert - sollte sein:

InetAddress.getByName(host).isReachable(timeOut) 
+29

Vorsicht, das funktioniert nicht immer! [Aus den Dokumenten] (http://developer.android.com/reference/java/net/InetAddress.html#isReachable%28int%29): "Diese Methode versucht zuerst, ICMP (ICMP ECHO REQUEST) zu verwenden. Beim ersten Schritt fehlschlägt, wird eine TCP-Verbindung auf Port 7 (Echo) des Remote-Hosts hergestellt. " Ich habe festgestellt, dass viele Android-Geräte ICMP nicht unterstützen, und viele Server akzeptieren keine TCP-Verbindungen über Port 7. 'isReachable()' dann einfach Timeout, während der Server erreichbar ist. –

+3

Wenn diese Methode nicht funktioniert - Sie können versuchen: http://StackOverflow.com/A/18845416 – yossico

+0

Sie müssen es auch asynchron verwenden, wenn im Haupt-Thread verwendet –

2

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.

0

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

Es scheint, dass die Verwendung des 'ping' Befehls bequem 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 
    ... 
} 
+11

Da dies mit Android markiert ist, würde ich gerne jemanden speichern Der Versuch, dies zu versuchen, wenn rohe Sockets unter Linux geöffnet werden, erfordert Root-Berechtigungen. Daher wird es * auf den meisten nicht gerooteten Geräten nicht funktionieren. Ich habe herausgefunden, dass es mehrere HTC-Geräte funktioniert, aber andere geben einfach "ping: icmp open socket: Operation nicht erlaubt" zurück. –

17

Mit einem einfachen Ping-like-Test, das ist für mich gearbeitet:

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

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

+0

Das funktioniert auch für mich. Danke. –

+0

Sorry, ich war immer noch auf der Suche nach einer Lösung. Was ich herausfand, ist das Laufen dieses im Hintergrund verbraucht viel Bandbreite, da ich nehme, dass es die while Seite im Hintergrund herunterlädt. Also versuche es jetzt mit dem Ping-Prozess. – Ayyappa

+0

Ok, ich sehe, danke für die Details. Fühlen Sie sich frei, meine Antwort zu bearbeiten, oder Ihre eigenen zu erstellen;) –

5

können Sie

InetAddress.getByName(host).isReachable(timeOut) 

verwenden, aber es nicht gut funktioniert, 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 benötigen:

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; 
} 
3
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 actived vergessen android.permission.ACCESS_NETWORK_STATE

+1

Es funktioniert nicht mit mir. Der Wert isReachable ist immer falsch. –

+0

bitte cek Ihre Verbindung oder überprüfen Sie die Serververbindung –

+0

sieht gut aus. wird etwas modifizieren und es versuchen. Vielen Dank –

2
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; 
} 
} 
Verwandte Themen