Android调试InetAddress.isReachable

时间:2010-05-29 13:59:38

标签: java android

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

从阅读开始,InetAddress.isReachable似乎应该为我做这件事。

最初我认为我可以编写类似的代码:

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

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

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

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

然后我尝试了另一个例子:

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比较陌生,所以我怀疑我错过了一些东西,但我找不到任何可以表明它是什么的东西。

2 个答案:

答案 0 :(得分:13)

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

您最好检查连接,建立与您知道应该打开的端口的TCP连接。

答案 1 :(得分:5)

谢谢Zed,我也知道我想要获取的地址将返回html,所以我可以做的不仅仅是查看套接字。以下是我最终做的事情,这对我的问题是合理的。参数pUrl具有其中的网站地址。我为超时选择了3秒。

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
}