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

时间:2012-01-18 23:30:22

标签: android

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

我正在使用API​​8,如果这对这个过程有很大的不同,并且必须迎合非根设备,那么inetaddress.isReachable已经用完了

4 个答案:

答案 0 :(得分:51)

这不是很漂亮,但我就这样做了:

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
}

答案 1 :(得分:22)

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

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

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

答案 2 :(得分:5)

解决方案

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

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

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

  

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

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

Java 7以下

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

final Socket socket = new Socket();
try {
    ...
} catch (java.io.IOException e) {
    ...
} finally {
    if (socket != null) {
        socket.close(); // this will throw another exception... just let the function throw it
    }
}

用法

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

if (isHostAvailable("google.com", 80, 1000)) {
    // do you work here
}

进一步阅读

Android文档:

#1:

答案 3 :(得分:2)

试试这个:

boolean reachable = false;

try {
    reachable = InetAddress.getByName("www.example.com").isReachable(2000);
} catch (IOException e) {
    e.printStackTrace();
    reachable = false;
}

if (reachable) { 
    // do your work here 
} 

但是,由于实现isReachable(int timeout)的方式,即使Web服务器正常运行,这也可能失败:

  

测试该地址是否可达。最好的努力是由   实现尝试到达主机,但防火墙和服务器   配置可能会阻止导致无法访问状态的请求   虽然某些特定端口可以访问。典型的实现   如果可以获得特权,将使用ICMP ECHO REQUEST,   否则它将尝试在端口7(Echo)上建立TCP连接   目的地主机。