具有多个IP地址的Java Httpurlconnection DNS解析
我正在使用Java的HttpUrlConnection访问foo.com foo.com有多个指向不同IP地址的A记录(1.1.1.1和1.1.1.2) 如果我的第一个connect调用解析为1.1.1.1,但该机器停机,那么后续的connect调用是否会识别出这一点,并尝试在1.1.1.2上进行连接具有多个IP地址的Java Httpurlconnection DNS解析,java,dns,httpurlconnection,Java,Dns,Httpurlconnection,我正在使用Java的HttpUrlConnection访问foo.com foo.com有多个指向不同IP地址的A记录(1.1.1.1和1.1.1.2) 如果我的第一个connect调用解析为1.1.1.1,但该机器停机,那么后续的connect调用是否会识别出这一点,并尝试在1.1.1.2上进行连接 或者我需要自己使用INetAddress api实现这种逻辑吗 我通过使用解决了这个问题,请参见下面的代码片段 正如我所担心的,java.net提供的URLConnection是一个非常简单的实现
或者我需要自己使用INetAddress api实现这种逻辑吗 我通过使用解决了这个问题,请参见下面的代码片段 正如我所担心的,java.net提供的URLConnection是一个非常简单的实现,它只会尝试解析列表中的第一个IP地址。如果确实不允许使用其他库,则必须编写自己的错误处理。这有点混乱,因为您需要在使用InetAddress之前解析所有IP,并连接到每个IP,将“Host:domain.name”头传递到HTTP堆栈,直到其中一个IP响应为止 Apache库更加健壮,并允许大量定制。您可以控制它将重试的次数,最重要的是,它将自动尝试解析为相同名称的所有IP地址,直到其中一个成功响应
HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException exception, int count, HttpContext context) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
return count < 30;
}
};
ConnectionKeepAliveStrategy keepAlive = new ConnectionKeepAliveStrategy() {
@Override
public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
return 500;
}
};
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter("http.socket.timeout", new Integer(2000));
httpclient.getParams().setParameter("http.connection.timeout", new Integer(2000));
httpclient.setHttpRequestRetryHandler(myRetryHandler);
httpclient.setKeepAliveStrategy(keepAlive);
HttpGet httpget = new HttpGet("http://remotehost.com");
HttpResponse httpres = httpclient.execute(httpget);
InputStream is = httpres.getEntity().getContent();
HttpRequestRetryHandler myRetryHandler=new-HttpRequestRetryHandler(){
@凌驾
公共布尔retryRequest(IOException异常、int计数、HttpContext上下文){
试一试{
睡眠(1000);
}捕捉(中断异常e){
}
返回计数<30;
}
};
ConnectionKeepAlivestStrategy keepAlive=新连接KeepAlivestStrategy(){
@凌驾
公共长getKeepAliveDuration(HttpResponse响应,HttpContext上下文){
返回500;
}
};
DefaultHttpClient httpclient=新的DefaultHttpClient();
httpclient.getParams().setParameter(“http.socket.timeout”,新整数(2000));
httpclient.getParams().setParameter(“http.connection.timeout”,新整数(2000));
setHttpRequestRetryHandler(myRetryHandler);
httpclient.setKeepAliveStrategy(keepAlive);
HttpGet HttpGet=新的HttpGet(“http://remotehost.com");
HttpResponse httpres=httpclient.execute(httpget);
InputStream is=httpres.getEntity().getContent();
我希望这有帮助 如果参数是一个url而不是一个ip,那么您不需要关心这个问题。