gpt4 book ai didi

Java Httpurlconnection 多IP地址的DNS解析

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:21:14 58 4
gpt4 key购买 nike

我正在使用 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 自己实现这种逻辑?

最佳答案

我使用 Apache Commons HttpClient 解决了这个问题,请参阅下面的代码片段。

正如我担心的那样,java.net 提供的 URLConnection 是一个非常简单的实现,只会尝试解析列表中的第一个 IP 地址。如果你真的不允许使用另一个库,你将不得不编写自己的错误处理。这有点困惑,因为您需要事先使用 InetAddress 解析所有 IP,并连接到每个 IP,自己将“Host: domain.name” header 传递给 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();

希望对您有所帮助!

关于Java Httpurlconnection 多IP地址的DNS解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7478424/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com