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

Android:如何检查服务器是否可用?,android,networking,connectivity,Android,Networking,Connectivity,我正在开发一个连接到服务器的应用程序。现在,如果服务器可用,登录和数据传输工作正常。当服务器不可用时会出现问题。在这种情况下,该方法发送登录请求并等待响应 是否有人知道如何检查服务器是否可用(可见) 必须实现的简单逻辑的伪代码如下: 字符串serverAddress=(从配置文件读取值)//已完成 布尔serverAvailable=(检查服务器serverAddress是否可用)//必须实现 (这是取决于可用服务器的逻辑) 他可能需要Java代码,因为他在Android上工作。Java的等价物

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

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

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

  • 字符串serverAddress=(从配置文件读取值)//已完成
  • 布尔serverAvailable=(检查服务器serverAddress是否可用)//必须实现
  • (这是取决于可用服务器的逻辑)

  • 他可能需要Java代码,因为他在Android上工作。Java的等价物——我认为它在Android上可以工作——应该是:

    InetAddress.getByName(host).isReachable(timeOut)
    

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

    如果执行一个请求,那么在给定的超时之后会出现异常。

    哦,不,不,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 ... } Runtime=Runtime.getRuntime(); processproc=runtime.exec(“ping fr.yahoo.com-c1”);//例如,其他服务器 进程waitFor(); int exit=proc.exitValue(); 如果(exit==0){//正常退出 /*获取执行ping命令的输出内容并对其进行解析 *决定是否可以访问服务器 */ }else{//异常退出,因此确定无法访问服务器 ... }
    通过一个简单的类似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;
    }
    
    不要忘记在线程(而不是主线程)中运行此函数。

    您可以使用

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

    试试看,为我工作,别忘了激活的android.permission.ACCESS_NETWORK_STATE

    这是一个带标签的android,我想省去任何人尝试这个的努力,因为在Linux上打开原始套接字需要根权限。因此,它不会在大多数无根设备上工作。我发现它可以在几个HTC设备上工作,但其他设备只是返回“ping:icmp open socket:Operation not Allowed”(ping:icmp open socket:Operation not Allowed)。请注意,这并不总是有效的!:“此方法首先尝试使用ICMP(ICMP回显请求)。当第一步失败时,远程主机的端口7(回显)上会建立TCP连接。”我发现许多Android设备不支持ICMP,许多服务器不接受端口7上的TCP连接
    isReachable()
    然后在服务器可访问时超时。如果在主线程中使用,您还需要异步使用它。您可以查看:这是一种很好的方法。(帮助我:))请检查您的连接或检查服务器连接对不起,我还在寻找解决方案。我发现在后台运行它会消耗大量带宽,因为我想它是在后台下载while页面的。现在就尝试ping进程。好的,我明白了,谢谢你提供的详细信息。请随意编辑我的答案,或提供您自己的答案;)@Gauthier Boaglio:我尝试了ping,但它返回的结果是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;
     }
    }
    
    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;
     }
    }