39

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

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

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

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

7 回答 7

51

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

InetAddress.getByName(host).isReachable(timeOut)
于 2009-09-18T09:04:46.743 回答
21

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

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

于 2013-06-05T19:34:24.257 回答
8

您可以使用

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;
}
于 2014-05-27T08:34:29.900 回答
4
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

于 2014-10-31T19:15:38.117 回答
2

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

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

于 2009-09-18T11:36:31.737 回答
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;
 }
}
于 2015-06-28T19:50:11.103 回答
0

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

看来使用 'ping' 命令很方便,例如:

运行时运行时 = Runtime.getRuntime();
进程 proc = runtime.exec("ping fr.yahoo.com -c 1"); // 其他服务器,例如
proc.waitFor();
int exit = proc.exitValue();
if (exit == 0) { // 正常退出
    /* 获取执行 ping 命令的输出内容并解析
     * 判断服务器是否可达
     */
} else { // 异常退出,所以判断服务器不可达
    ...
}
于 2010-05-07T11:37:08.783 回答