Java Android调试InetAddress.isRechable

Java Android调试InetAddress.isRechable,java,android,Java,Android,我试图弄清楚如何在调试过程中判断android应用程序中是否有特定的IP地址可用(我还没有在实际设备上尝试过) 从阅读中可以看出,InetAddress.isReachable应该为我做到这一点 最初我认为我可以编写如下代码: InetAddress=InetAddress.getByAddress(新字节[]{(字节)192,(字节)168,(字节)254,(字节)10); success=地址.isReachable(3000) 这返回false,即使我合理地确定它是一个可访问的地址 我发现

我试图弄清楚如何在调试过程中判断android应用程序中是否有特定的IP地址可用(我还没有在实际设备上尝试过)

从阅读中可以看出,InetAddress.isReachable应该为我做到这一点

最初我认为我可以编写如下代码:

InetAddress=InetAddress.getByAddress(新字节[]{(字节)192,(字节)168,(字节)254,(字节)10); success=地址.isReachable(3000)

这返回false,即使我合理地确定它是一个可访问的地址

我发现如果我把它改成127,0,0,1,它会返回成功

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

于是我又尝试了一个例子:

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,通常需要根权限,然后尝试建立到端口7的连接,在现代系统上通常没有运行的服务


你最好通过建立TCP连接来检查连接,连接到你知道应该打开的端口。

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

“它试图建立到端口7的连接,这在现代系统上通常没有运行的服务”……是的,但这并不重要,因为它将端口7的“连接被拒绝”解释为成功,表明主机在那里,TCP启动。许多系统在混乱数小时后不会发送“连接被拒绝”或“端口无法访问”消息有了这个,我意识到它不起作用了。真是一团糟。不过谢谢你的回答+1@MarquisofLorne你确定它试图访问端口7吗?那是回显服务。关于这一点的文档非常糟糕。这是否意味着如果它不尝试使用ping/ICMP,那么对设备根目录的需求是虚假的?