Android:如何检查服务器是否可用?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1443166/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 03:05:54  来源:igfitidea点击:

Android: How to check if the server is available?

androidnetworkingconnectivity

提问by Niko Gamulin

I am developing an application which connects to the server. By now the login and data transmission works fine if theserver is available. The problem arises when the server is unavailable. In this case the method sends a login request and waits for the response.

我正在开发一个连接到服务器的应用程序。如果服务器可用,现在登录和数据传输工作正常。当服务器不可用时就会出现问题。在这种情况下,该方法发送登录请求并等待响应。

Does anyone know how to check if the server is available (visible)?

有谁知道如何检查服务器是否可用(可见)?

The pseudocode of the simple logic that has to be implemented is the following:

必须实现的简单逻辑的伪代码如下:

  1. String serverAddress = (Read value from configuration file) //already done
  2. boolean serverAvailable = (Check if the server serverAddress is available)//has to be implemented
  3. (Here comes the logic which depends on serverAvailable)
  1. String serverAddress = (Read value from configuration file) //已经完成
  2. boolean serverAvailable = (检查服务器serverAddress是否可用)//必须实现
  3. (这里是依赖于 serverAvailable 的逻辑)

回答by Sean Owen

He probably needs Java code since he's working on Android. The Java equivalent -- which I believe works on Android -- should be:

他可能需要 Java 代码,因为他正在研究 Android。Java 等价物——我相信它适用于 Android——应该是:

InetAddress.getByName(host).isReachable(timeOut)

回答by Gauthier Boaglio

With a simple ping-like test, this worked for me :

通过一个简单的类似 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;
}

Do not forget to run this function in a thread (not in the main thread).

不要忘记在一个线程中运行这个函数(而不是在主线程中)。

回答by adudakov

you can use

您可以使用

InetAddress.getByName(host).isReachable(timeOut)

but it doesn't work fine when host is not answering on tcp 7. You can check if the host is available on that port what you need with help of this function:

但是当主机没有在 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;
}

回答by Dwi NetraliZme

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

try it, work for me and dont forget actived android.permission.ACCESS_NETWORK_STATE

试试看,为我工作,不要忘记激活 android.permission.ACCESS_NETWORK_STATE

回答by Iman Marashi

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

回答by Matthias

Are you working with HTTP? You could then set a timeout on your HTTP connection, as such:

你在使用 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);
}

If you then execute a request, you will get an exception after the given timeout.

如果您随后执行请求,您将在给定的超时后收到异常。

回答by kinhnc

Oh, no no, the code in Java doesn't work: InetAddress.getByName("fr.yahoo.com").isReachable(200) although in the LogCat I saw its IP address (the same with 20000 ms of time out).

哦,不,Java 中的代码不起作用: InetAddress.getByName("fr.yahoo.com").isReachable(200) 尽管在 LogCat 中我看到了它的 IP 地址(与 20000 毫秒超时相同) .

It seems that the use of the 'ping' command is convenient, for example:

使用'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
    ...
}