Мне удалось решить эту проблему с помощью Apache Commons HttpClient , см. Фрагмент кода ниже.
Как я и опасался, URLConnection, предоставляемый java.net, является очень упрощенной реализацией и будет пробовать только первый IP-адрес из разрешенного списка. Если вам действительно не разрешено использовать другую библиотеку, вам придется написать свою собственную обработку ошибок. Это немного запутанно, так как вам нужно разрешить все IP-адреса заранее, используя InetAddress, и подключаться к каждому 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();
Надеюсь, это поможет!