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

发布于 2024-08-04 22:21:24 字数 312 浏览 4 评论 0原文

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

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

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

  1. String serverAddress = (从配置文件中读取值) //已经完成
  2. boolean serverAvailable = (检查服务器 serverAddress 是否可用)//必须实现
  3. (这里来了取决于 serverAvailable 的逻辑)

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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

晨曦慕雪 2024-08-11 22:21:24

他可能需要 Java 代码,因为他正在开发 Android。 Java 的等价物——我相信它可以在 Android 上运行——应该是:

InetAddress.getByName(host).isReachable(timeOut)

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

InetAddress.getByName(host).isReachable(timeOut)

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

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

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

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

白衬杉格子梦 2024-08-11 22:21:24

您可以使用

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

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:

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;
}
酒绊 2024-08-11 22:21:24
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;
}

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

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

苹果你个爱泡泡 2024-08-11 22:21:24
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;
 }
}
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;
 }
}
浮云落日 2024-08-11 22:21:24

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

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

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

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.

孤檠 2024-08-11 22:21:24

哦,不不,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
    ...
}

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

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

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
    ...
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文