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