Android: как проверить, доступен ли сервер? - PullRequest
36 голосов
/ 18 сентября 2009

Я разрабатываю приложение, которое подключается к серверу. К настоящему времени логин и передача данных работают нормально, если сервер доступен. Проблема возникает, когда сервер недоступен. В этом случае метод отправляет запрос на вход в систему и ожидает ответа.

Кто-нибудь знает, как проверить, доступен ли сервер (виден)?

Псевдокод простой логики, которая должна быть реализована, выглядит следующим образом:

  1. String serverAddress = (Считать значение из файла конфигурации) // уже сделано
  2. boolean serverAvailable = (Проверить, доступен ли адрес serverAddress) // должен быть реализован
  3. (здесь идет логика, которая зависит от serverAvailable)

Ответы [ 7 ]

48 голосов
/ 18 сентября 2009

Ему, вероятно, нужен код Java, так как он работает на Android. Эквивалент Java - который я считаю работающим на Android - должен быть:

InetAddress.getByName(host).isReachable(timeOut)
19 голосов
/ 05 июня 2013

С помощью простого ping-подобного теста это сработало для меня:

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

Не забудьте запустить эту функцию в потоке (не в основном потоке).

5 голосов
/ 27 мая 2014

вы можете использовать

InetAddress.getByName(host).isReachable(timeOut)

, но он не работает нормально, когда хост не отвечает на tcp 7. Вы можете проверить, доступен ли хост на том порту, что вам нужно, с помощью этой функции:

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 голосов
/ 31 октября 2014
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;
}

попробуй, работай на меня и не забудь actived android.permission.ACCESS_NETWORK_STATE

2 голосов
/ 28 июня 2015
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 голосов
/ 18 сентября 2009

Вы работаете с HTTP? Затем вы можете установить тайм-аут для вашего HTTP-соединения, например:

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

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

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

Если вы затем выполните запрос, вы получите исключение по истечении указанного времени ожидания.

0 голосов
/ 07 мая 2010

О нет, нет, код на Java не работает: InetAddress.getByName ("fr.yahoo.com"). IsReachable (200), хотя в LogCat я видел его IP-адрес (такой же, как 20000 мс тайм-аут).

Кажется, что использование команды 'ping' удобно, например:

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