检查Android中的主机可访问性/可用性

fur*_*s12 22 android

我一直试图做我认为在我的应用程序互联网企业开始时主机测试的简单可达性,但文档没有帮助,也没有在各个地方找到的例子,我尝试了许多解决方案没有运气,所以如果有人可以指向一个确定的方法来检查主机可用性与android是非常棒的,如果可以到达主机,只需要将bool切换为true

我使用API​​8,如果这对这个过程有很大的不同,并且必须迎合非root设备,所以inetaddress.isReachable已经出来了

gho*_*555 53

它不漂亮,但这就是我做的方式:

boolean exists = false;

try {
    SocketAddress sockaddr = new InetSocketAddress(ip, port);
    // Create an unbound socket
    Socket sock = new Socket();

    // This method will block no more than timeoutMs.
    // If the timeout occurs, SocketTimeoutException is thrown.
    int timeoutMs = 2000;   // 2 seconds
    sock.connect(sockaddr, timeoutMs);
    exists = true;
} catch(IOException e) {
    // Handle exception
}
Run Code Online (Sandbox Code Playgroud)


Ric*_*win 23

要检查连接,您可以使用:

public boolean isOnline(Context context) { 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);    
    NetworkInfo netInfo = cm.getActiveNetworkInfo();    
    return netInfo != null && netInfo.isConnectedOrConnecting();
}
Run Code Online (Sandbox Code Playgroud)

如果它报告连接,您还可以通过尝试执行http访问地址然后检查返回的状态代码进行检查.如果没有返回状态代码,则可以确定主机无法访问.

  • 如果我没有弄错,这只是检查设备是否有能力使用互联网而不检查实际主机/网站的可用性? (13认同)
  • 是的,提供的代码会检查功能,但是然后您可以通过尝试在主机上执行http get来检查主机的可访问性.将我的代码段与ghostbust555代码相结合将提供非常强大的检查工作流程.即如果我的代码说有互联网连接,则运行他的代码.如果没有可用的互联网连接,那么尝试联系主机是没有意义的. (4认同)

win*_*rrr 6

Java 7及以上版本

这是我用于任何Java 7及以上项目的代码:

/**
 * Check if host is reachable.
 * @param host The host to check for availability. Can either be a machine name, such as "google.com",
 *             or a textual representation of its IP address, such as "8.8.8.8".
 * @param port The port number.
 * @param timeout The timeout in milliseconds.
 * @return True if the host is reachable. False otherwise.
 */
public static boolean isHostAvailable(final String host, final int port, final int timeout) {
    try (final Socket socket = new Socket()) {
        final InetAddress inetAddress = InetAddress.getByName(host);
        final InetSocketAddress inetSocketAddress = new InetSocketAddress(inetAddress, port);

        socket.connect(inetSocketAddress, timeout);
        return true;
    } catch (java.io.IOException e) {
        e.printStackTrace();
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个选择(更快但更不精确)

您可以使用而不是打开完整的套接字连接inetAddress.isReachable(int timeout).这会使检查更快但也更不精确,因为这种方法只是建立在一个echo请求上:

如果可以获得特权,则典型的实现将使用ICMP ECHO REQUEST,否则它将尝试在目标主机的端口7(Echo)上建立TCP连接.

对于我的用例,我必须建立与Web服务器的连接.因此,我必须启动并运行服务器上的服务.因此,对于简单的echo请求,套接字连接是我的首选.

Java 7下面

try-catch-resource上面代码中的块仅适用于Java 7和更新版本.在版本7之前,finally需要一个-block来确保资源正确关闭:

public static boolean isHostAvailable(final String host, final int port, final int timeout) {
    final Socket socket = new Socket();
    try {
        ... // same as above
    } catch (java.io.IOException e) {
        ... // same as above
    } finally {
        if (socket != null) {
            socket.close(); // this will throw another exception... just let the function throw it
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

host 可以是计算机名称,例如"google.com",也可以是IP地址,例如"8.8.8.8".

if (isHostAvailable("google.com", 80, 1000)) {
    // do you work here
}
Run Code Online (Sandbox Code Playgroud)

进一步阅读

Android文档:

堆栈溢出: