Java HttpURLConnection использует SOCKS прокси вместо HTTP - PullRequest
2 голосов
/ 04 июля 2010

У меня очень простой код, который использует HttpURLConnection для доступа к какому-либо веб-сайту через прокси

    System.setProperty("java.net.useSystemProxies", "true");
    System.out.println("Proxy: " + ProxySelector.getDefault().select(new URI(urlS)));
    URL url = new URL(urlS);
    HttpURLConnection ic = (HttpURLConnection)url.openConnection();

    ic.connect();

По какой-то причине Java считает, что мне нужен прокси-сервер SOCKS, а не http, и выдает следующее исключение:

ERROR: Can't connect to SOCKS proxy:Connection timed out: connect

Ответы [ 4 ]

5 голосов
/ 04 июля 2010

Если у вас возникают эти проблемы в Windows, вы можете столкнуться с ошибкой Java.

Java рассматривает любой параметр прокси системы как SOCKS.Вы должны либо отключить useSystemProxies, либо не использовать прокси в Windows.

Если прокси нужен, попробуйте снять флажок «Использовать один и тот же прокси-сервер для всех протоколов», убедившись, что поле для прокси SOCKS пустое,Это решило нашу проблему.

2 голосов
/ 14 августа 2014

Реальная проблема заключается в том, что Java предполагает, что проверка «Использовать один и тот же прокси-сервер для всех протоколов» также влияет на прокси-сервер SOCKS (я не знаю логику этого диалога в Windows, но это, по крайней мере, сбивает с толку) Если проверка установлена, вы получаете включенные прокси как для HTTP, так и для SOCKS, что вряд ли будет желаемой конфигурацией. Один из способов решить эту проблему - снять отметку с чека и оставить поле SOCKS незаполненным.

Я наконец решил, создав ProxySelector, который сначала вызывает селектор по умолчанию, и если он находит ту же конфигурацию для соединений HTTP и SOCKS, он пропускает прокси SOCKS.

   public class SocksFixerProxySelector extends ProxySelector {

    ProxySelector base;

    public SocksFixerProxySelector() {
         base = ProxySelector.getDefault();
    }

    @Override
    public List<Proxy> select(URI uri) {

        List<Proxy> baseList = base.select(uri);

        try {
            if (uri.getScheme().equals("socket")) {

                Proxy socksProxy = findByType(baseList, Type.SOCKS);
                if (socksProxy != null) {

                    URI httpTestUri = new URI("http", uri.getHost(), uri.getPath(), uri.getFragment());
                    Proxy httpProxy = findByType(base.select(httpTestUri), Type.HTTP);

                    if (httpProxy != null && socksProxy.address().equals(httpProxy.address())) {
                        // Quitamos SOCKS
                        List<Proxy> filteredList = new ArrayList<>(baseList);
                        filteredList.remove(socksProxy);
                        return filteredList;
                    }
                }
            }
        } catch (Exception e) {

        }
        return baseList;

    }

    @Override
    public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
        base.connectFailed(uri, sa, ioe);

    }

    private Proxy findByType(List<Proxy> proxies, Proxy.Type type) {
        for (Proxy proxy : proxies) {
            if (proxy.type() == type)
                return proxy;
        }

        return null;
    }

Возможно, лучшим решением было бы проверить реестр и определить правильные настройки, но я не хотел связываться с конкретным кодом Windows (и все эти настройки скриптов тоже выглядели плохо)

1 голос
/ 04 июля 2010

Вместо этого вам нужно использовать системное свойство http.proxyHost. Подробнее см. http://java.sun.com/javase/6/docs/technotes/guides/net/proxies.html.

java -Dhttp.proxyHost=webcache.mydomain.com GetURL
1 голос
/ 04 июля 2010

Убедитесь, что в свойствах системы что-то не установлено "socksProxyHost".

EDIT

Свойство "useSystemProxies" описывается так:

"В последних системах Windows и на платформах Gnome 2.x можно указать по умолчанию ProxySelector, чтобы использовать настройки системного прокси (как в последних версиях Windows, так и в Gnome 2.x вы можете устанавливать прокси глобально через их пользователя интерфейс). Если системному свойству java.net.useSystemProxies присвоено значение true (по умолчанию установлено значение false для совместимости), то по умолчанию ProxySelector попытается использовать эти параметры. "

Итак, предполагая, что вы не указали свой собственный класс ProxySelector, вам также следует проверить настройки прокси-сервера системы, чтобы убедиться, что они не говорят об использовании SOCKS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...