Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多个IP地址的Java Httpurlconnection DNS解析_Java_Dns_Httpurlconnection - Fatal编程技术网

具有多个IP地址的Java Httpurlconnection DNS解析

具有多个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是一个非常简单的实现

我正在使用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是一个非常简单的实现,它只会尝试解析列表中的第一个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,那么您不需要关心这个问题。