[英]Android Debugging InetAddress.isReachable
I am trying to figure out how to tell if a particular ipaddress is available in my android app during debugging ( I haven't tried this on an actual device ).我试图弄清楚如何在调试期间判断特定 ipaddress 在我的 android 应用程序中是否可用(我还没有在实际设备上尝试过)。
From reading it appears that InetAddress.isReachable should do this for me.从阅读看来, InetAddress.isReachable 应该为我做这件事。
Initially I thought that I could code something like:最初我认为我可以编写如下代码:
InetAddress address = InetAddress.getByAddress( new byte[] { (byte) 192, (byte) 168, (byte) 254, (byte) 10 ); InetAddress 地址 = InetAddress.getByAddress( new byte[] { (byte) 192, (byte) 168, (byte) 254, (byte) 10 ); success = address.isReachable( 3000 );
成功 = address.isReachable(3000);
This returns false even though I am reasonably sure it is a reachable address.即使我有理由确定它是一个可访问的地址,这也会返回 false。
I found that if I changed this to 127, 0, 0, 1 it returned success.我发现如果我把它改成 127, 0, 0, 1 它返回成功。
My next attempt was same code, but I used the address I got from a ping of www.google.com ( 72.167.164.64 as of this writing ).我的下一次尝试是相同的代码,但我使用了从 www.google.com ping 获得的地址(撰写本文时为 72.167.164.64)。 No success.
没有成功。
So then I tried a further example:然后我尝试了一个进一步的例子:
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
}
}
I am relatively new to Java and Android so I suspect I am missing something, but I can't find anything that would indicate what that is.我对 Java 和 Android 比较陌生,所以我怀疑我遗漏了一些东西,但我找不到任何可以表明那是什么的东西。
seems that isReachable() never worked well on Android b/c it tries to use ICMP, that usually needs a root privileges, and then it tries to establish connection to port 7, that's usually have no running services on modern systems.似乎 isReachable() 在 Android b/c 上运行得不好,它尝试使用 ICMP,通常需要 root 权限,然后它尝试建立与端口 7 的连接,在现代系统上通常没有正在运行的服务。
you'd better check connectivity with establishing TCP connection to ports you know should be open.您最好通过建立与您知道应该打开的端口的 TCP 连接来检查连接性。
Thanks Zed, I also know that the address I am trying to get will return html, so I can do more than look at the socket.谢谢 Zed,我也知道我试图获取的地址将返回 html,所以我可以做的不仅仅是查看套接字。 Here is what I ended up doing that works reasonably for my problem.
这是我最终为我的问题所做的合理工作。 The parameter pUrl has the address of a website in it.
参数 pUrl 中包含网站的地址。 I chose 3 seconds for the timeout.
我为超时选择了 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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.