2010-05-29 46 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 
}