UnknownHostException за прокси - PullRequest
       16

UnknownHostException за прокси

0 голосов
/ 02 мая 2019

У меня есть Java-программа, которая подключается к веб-сайту для получения из него XML.Это прекрасно работает на моем компьютере, а также других за пределами нашей компании.Один из наших клиентов сейчас не может подключиться к сайту.Я выяснил, что они за прокси.Теперь я нашел, какие настройки мне нужно использовать, и в моей тестовой программе это работает (частично).

В приведенном ниже коде вызов downloadFile() работает, как и ожидалось, и файл можно загрузить без проблем.,Сбой contactHost() на наших клиентских машинах с UnknownHostException:

java.net.UnknownHostException: No such host is known (api.myserver.de)
    at java.base/java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
    at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:925)
    at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1505)
    at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:844)
    at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1495)
    at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1354)
    at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1288)
    at org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45)
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:111)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)

Справочная информация: на машинах с Windows 10 наша программа поставляется с внутренним OpenJDK, версия "10.0.2" 2018-07-17.Программа запускается со следующим определением -Djdk.http.auth.tunneling.disabledSchemes="" -Djava.net.preferIPv4Stack=true, чтобы использовать только IP4 и включить BasicAuthentification для прокси.С этими настройками файл может быть загружен, однако UnknownHostException все еще там.

Мы также пытались открыть используемый URL в браузере, и это работает как исключение, то есть в браузере открывается веб-сайт.

Вот мой код для тестирования:

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Authenticator;
import java.net.URL;
import java.net.URLConnection;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;

public class LFTProxyTest {

private static String uname = null;
private static String pass = null;

public static void main(String[] args) {
    System.setProperty("java.net.useSystemProxies", "true");
    // uname = "test"; // whatever that user provides
    // pass = "sectret"; // whatever that user provides
    Authenticator.setDefault(new ProxyAuth(uname, pass));

    contactHost();
    downloadFile();
}

private static boolean downloadFile() {
    System.out.println("CHECK connection");
    int cp = contactHost();
    if (cp == 200)
        return true;
    if (cp == 407)
        return false;
    else {
        try {
            System.out.println("Try loading file: ");
            URL url = new URL("https://www.google.de");
            URLConnection urlConnection = url.openConnection();
            InputStream in = new BufferedInputStream(urlConnection.getInputStream());
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            dBuilder.parse(in);
            System.out.println("    FILE DOWNLOAD successfull!");
        } catch (Exception e) {
            System.out.println("    FILE DOWNLOAD failed:");
            System.out.println("***EXCEPTION: " + e.getMessage());
            return false;
        }
    }
    System.out.println("CHECK done");
    return true;
}

private static int contactHost() {
    HttpClient client = HttpClientBuilder.create().build();// new DefaultHttpClient();
    String catalogURI = "https://api.myserver.de/query";
    HttpGet request = new HttpGet(catalogURI);
    try {
        int ret = 0;
        HttpResponse response = client.execute(request);
        ret = response.getStatusLine().getStatusCode();
        System.out.println("PROXY test: " + ret);
        ((CloseableHttpClient) client).close();
        return ret;
    } catch (IOException e) {
        e.printStackTrace();
        return -1;
    }
}

}

Я не знаю, что на самом деле знаю, я даже не уверен, где может быть ошибка.Любые идеи высоко ценятся!

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Хорошо, поэтому после некоторого дальнейшего поиска я обнаружил, что org.apache.http.client.HttpClient вообще не относится к java.net.useSystemProxies, будь то установка через System или через -D.И это также игнорирует http.proxyHost и т. Д. Решение состоит в том, чтобы использовать ProxySelector следующим образом:

    ProxySelector.setDefault(new ProxySelector() {

        @Override
        public List<Proxy> select(URI uri) {
            ArrayList<Proxy> list = new ArrayList<Proxy>(); 
            list.add(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy1.de", 8000)));
            list.add(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy2.de", 8080)));
            return list;
        }

        @Override
        public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
            logger.error("Error in ProxySelector, connection Failed: ", ioe);
        }
    });

У меня сейчас другое исключение, но я мог бы открыть для этого еще один поток.

0 голосов
/ 02 мая 2019

UnknownHostException обозначает довольно прямую проблему.Что IP-адрес удаленного хоста, к которому вы пытаетесь подключиться, не может быть разрешен.Таким образом, решение этого очень просто.Вы должны проверить ввод Socket (или любого другого метода, который выбрасывает UnknownHostException), и проверить, что это предполагаемый.Если у вас нет правильного имени хоста, вы можете запустить терминал UNIX и с помощью команды nslookup (среди прочего) проверить, может ли ваш DNS-сервер успешно преобразовать имя хоста в IP-адрес.

Если вы используете Windows, вы можете использовать команду host.Если это не работает должным образом, вам следует проверить правильность имени хоста, а затем попытаться обновить кэш DNS.Если это тоже не сработает, попробуйте использовать другой DNS-сервер, например, Google Public DNS - очень хорошая альтернатива.

...