关于java:Android调试InetAddress.isReachable

Android Debugging InetAddress.isReachable

我试图弄清楚如何在调试期间判断我的android应用程序中是否有特定的ipaddress(我没有在实际设备上尝试过)。

从阅读看来,InetAddress.isReachable应该为我执行此操作。

最初,我认为我可以编写类似以下内容的代码:

InetAddress地址= InetAddress.getByAddress(new byte [] {(byte)192,(byte)168,(byte)254,(byte)10);
成功= address.isReachable(3000);

即使我有理由确定它是一个可到达的地址,它也会返回false。

我发现如果将其更改为127、0、0、1,它将返回成功。

我的下一个尝试是使用相同的代码,但是我使用的是从ping www.google.com上获得的地址(在撰写本文时为72.167.164.64)。没有成功

因此,我尝试了另一个示例:

1
2
3
4
5
6
7
8
9
int timeout = 2000;
InetAddress[] addresses = InetAddress.getAllByName("www.google.com");
for (InetAddress address : addresses)
{
    if ( address.isReachable(timeout))
    {
       success = true; // just set a break point here
    }
}

我是Java和Android的新手,所以我怀疑我缺少什么,但是找不到任何可以表明其含义的东西。


似乎isReachable()在Android b / c上无法正常运行,它尝试使用ICMP,通常需要root特权,然后尝试建立与端口7的连接,该端口通常在现代系统上没有正在运行的服务。

您最好通过建立与您应该打开的端口的TCP连接来检查连接性。


谢谢Zed,我也知道我要获取的地址将返回html,所以我可以做的比看套接字还要多。 这就是我最终所做的事情,可以合理地解决我的问题。 参数pUrl中包含网站的地址。 我为超时选择了3秒。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
boolean result = false;
try
{
    HttpGet request = new HttpGet(pUrl.toString());

    HttpParams httpParameters = new BasicHttpParams();  

    HttpConnectionParams.setConnectionTimeout(httpParameters, 3000);
    HttpClient httpClient = new DefaultHttpClient(httpParameters);
    HttpResponse response = httpClient.execute(request);

    int status = response.getStatusLine().getStatusCode();

    if (status == HttpStatus.SC_OK)
    {
        result = true;
    }

}
catch (SocketTimeoutException e)
{
    result = false; // this is somewhat expected
}