2010-05-29 82 views
7

我想弄清楚如何在调试期间(我没有在实际设备上尝试过)在我的android应用程序中使用特定的ipaddress。Android调试InetAddress.isReachable

从阅读看来,InetAddress.isReachable应该为我做这个。

最初我以为我可以编码这样的:

的InetAddress地址= InetAddress.getByAddress(新字节[] {(字节)192,(字节)168,(字节)254,(字节)10) ; success = address.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所以我怀疑我失去了一些东西,但我找不到任何可以表明那是什么。

回答

12

似乎是可接受的()在Android b/c上从未运行良好,它试图使用ICMP,通常需要root权限,然后它尝试建立到端口7的连接,通常在现代系统上没有正在运行的服务。

你最好检查一下连接,建立TCP连接到你应该打开的端口。

+0

“它试图建立连接7号端口,这通常对现代系统没有正在运行的服务” ......是的,但这并不重要,因为它解释“连接被拒绝” 7号端口的成功,表明主机在那里并且TCP已启动。 – EJP 2010-07-06 03:30:52

+2

许多系统不会发送'连接被拒绝'或'端口不可达'消息 – 2010-07-07 06:22:30

4

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