I am trying to figure out how to tell if a particular ipaddress is available in my androi开发者_运维知识库d app during debugging ( I haven't tried this on an actual device ).
From reading it appears that InetAddress.isReachable should do this for me.
Initially I thought that I could code something like:
InetAddress address = InetAddress.getByAddress( new byte[] { (byte) 192, (byte) 168, (byte) 254, (byte) 10 ); success = address.isReachable( 3000 );
This returns false even though I am reasonably sure it is a reachable address.
I found that if I changed this to 127, 0, 0, 1 it returned success.
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 ). 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.
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.
you'd better check connectivity with establishing TCP connection to ports you know should be open.
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. Here is what I ended up doing that works reasonably for my problem. The parameter pUrl has the address of a website in it. I chose 3 seconds for the timeout.
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
}
精彩评论