【问题标题】:Java Httpurlconnection DNS resolution with multiple IP addresses具有多个 IP 地址的 Java Httpurlconnection DNS 解析
【发布时间】:2011-09-19 23:19:50
【问题描述】:

我正在使用 Java 的 HttpUrlConnection 访问 foo.com

foo.com 有多个指向不同 IP 地址(1.1.1.1 和 1.1.1.2)的 A 记录

如果我的第一个连接调用解析为 1.1.1.1,但随后该机器出现故障,后续的连接调用是否会识别到这一点并尝试在 1.1.1.2 上进行连接?

或者我是否需要使用 INetAddress api 自己实现这种逻辑?

【问题讨论】:

  • 如果参数是url而不是ip,那么这个就不用管了。

标签: java dns httpurlconnection


【解决方案1】:

我能够通过使用Apache Commons HttpClient 解决此问题,请参阅下面的代码 sn-p。

正如我所担心的,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();

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2018-06-04
    • 2012-09-27
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2014-06-18
    • 2010-11-01
    相关资源
    最近更新 更多