虽然Socket类有setTimeout()方法,URLConnection有setConnectTimeout()方法,但这都不能给DNS查询过程添加时间限制,也就是说,如果DNS服务器挂了,那么代码就会阻塞几十秒才能抛出异常。我最近就遇到了这个问题,当DNS服务器出问题的时候,setTimeout()设置的超时时间就不起作用了。
经过google,发现Java目前居然还没有现成的API来处理DNS查询超时的问题。不过一个老外的博客上给出了一种曲线救国的方法:
public class DNSLookupThread extends Thread {
private InetAddress addr;
private String hostname;
public DNSLookupThread(String hostname) {
this.hostname = hostname;
}
public void run() {
try {
InetAddress add = InetAddress.getByName(hostname);
set(add);
} catch (UnknownHostException e) {
}
}
private synchronized void set(InetAddress addr) {
this.addr = addr;
}
public synchronized String getIP() {
if (null != this.addr) {
return addr.getHostAddress();
}
return null;
}
}
类的使用方法如下:
DNSQuery dnsTh = new DNSQuery();
dnsTh.start();
dnsTh.join(2000);
System.out.println(dnsTh.get()

本文介绍了一种通过自定义线程类来解决Java DNS查询超时问题的方法,该方法通过创建一个子线程并使用join()函数限制主线程等待DNS响应的时间,从而避免长时间阻塞。
最低0.47元/天 解锁文章
259

被折叠的 条评论
为什么被折叠?



