我正在试图弄清楚如何在调试期间判断我的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比较陌生,所以我怀疑我错过了一些东西,但我找不到任何可以表明它是什么的东西。
答案 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
}