Đối với những người nói rằng câu trả lời của @ kuester2000 không hoạt động, xin lưu ý rằng các yêu cầu HTTP, trước tiên hãy thử tìm IP máy chủ với yêu cầu DNS và sau đó thực hiện yêu cầu HTTP thực tế đến máy chủ, vì vậy bạn cũng có thể cần phải đặt thời gian chờ cho yêu cầu DNS.
Nếu mã của bạn hoạt động mà không có thời gian chờ cho yêu cầu DNS thì đó là vì bạn có thể truy cập máy chủ DNS hoặc bạn đang nhấn bộ đệm DNS của Android. Bằng cách này, bạn có thể xóa bộ nhớ cache này bằng cách khởi động lại thiết bị.
Mã này mở rộng câu trả lời ban đầu để bao gồm tra cứu DNS thủ công với thời gian chờ tùy chỉnh:
//Our objective
String sURL = "http://www.google.com/";
int DNSTimeout = 1000;
int HTTPTimeout = 2000;
//Get the IP of the Host
URL url= null;
try {
url = ResolveHostIP(sURL,DNSTimeout);
} catch (MalformedURLException e) {
Log.d("INFO",e.getMessage());
}
if(url==null){
//the DNS lookup timed out or failed.
}
//Build the request parameters
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, HTTPTimeout);
HttpConnectionParams.setSoTimeout(params, HTTPTimeout);
DefaultHttpClient client = new DefaultHttpClient(params);
HttpResponse httpResponse;
String text;
try {
//Execute the request (here it blocks the execution until finished or a timeout)
httpResponse = client.execute(new HttpGet(url.toString()));
} catch (IOException e) {
//If you hit this probably the connection timed out
Log.d("INFO",e.getMessage());
}
//If you get here everything went OK so check response code, body or whatever
Phương pháp sử dụng:
//Run the DNS lookup manually to be able to time it out.
public static URL ResolveHostIP (String sURL, int timeout) throws MalformedURLException {
URL url= new URL(sURL);
//Resolve the host IP on a new thread
DNSResolver dnsRes = new DNSResolver(url.getHost());
Thread t = new Thread(dnsRes);
t.start();
//Join the thread for some time
try {
t.join(timeout);
} catch (InterruptedException e) {
Log.d("DEBUG", "DNS lookup interrupted");
return null;
}
//get the IP of the host
InetAddress inetAddr = dnsRes.get();
if(inetAddr==null) {
Log.d("DEBUG", "DNS timed out.");
return null;
}
//rebuild the URL with the IP and return it
Log.d("DEBUG", "DNS solved.");
return new URL(url.getProtocol(),inetAddr.getHostAddress(),url.getPort(),url.getFile());
}
Lớp học này là từ bài viết trên blog này . Đi và kiểm tra các nhận xét nếu bạn sẽ sử dụng nó.
public static class DNSResolver implements Runnable {
private String domain;
private InetAddress inetAddr;
public DNSResolver(String domain) {
this.domain = domain;
}
public void run() {
try {
InetAddress addr = InetAddress.getByName(domain);
set(addr);
} catch (UnknownHostException e) {
}
}
public synchronized void set(InetAddress inetAddr) {
this.inetAddr = inetAddr;
}
public synchronized InetAddress get() {
return inetAddr;
}
}