2015-11-06 3 views
7

Как избежать соединения с ProxySelector при подключении URLConnection или, вернее, как получить соединение, гарантированное без каких-либо прокси, о которых знает Java?Как получить соединение без прокси-сервера в Java?

Я думал, что это был Proxy.NO_PROXY был для. Цитируя Javadoc:

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

Однако такое соединение все равно будет идти через ProxySelector. Я не понимаю?

Я сделал небольшой тест, чтобы доказать свою точку зрения:

public static void main(String[] args) throws MalformedURLException, IOException { 
    ProxySelector.setDefault(new MyProxySelector()); 
    URL url = new URL("http://foobar.com/x1/x2"); 
    URLConnection connection = url.openConnection(Proxy.NO_PROXY); 
    connection.connect(); 
} 

и фиктивный ProxySelector, которая не делает ничего, кроме журналов того, что происходит:

public class MyProxySelector extends ProxySelector { 

    @Override 
    public List<Proxy> select(URI uri) { 
     System.out.println("MyProxySelector called with URI = " + uri); 
     return Collections.singletonList(Proxy.NO_PROXY); 
    } 

    @Override 
    public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {} 
} 

который печатает:

"MyProxySelector called with URI = socket://foobar.com:80" 

(Обратите внимание, что протокол изменился с http на socket)

Я могу, конечно, создать свой ProxySelector таким образом, чтобы она всегда возвращает Proxy.NO_PROXY если схема URI является socket, но я думаю, там будет иметь место случаи, когда есть SOCKS прокси на сайте, и тогда он не будет верно ,

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

+1

Я думаю, вы также можете установить 'ProxySelector.setDefault (null);'. Это позволит напрямую подключиться. – Tunaki

+0

@ Tunaki. К сожалению, это полностью отключит ProxySelector и для * all * соединений. – peterh

+1

Тот факт, что прямые соединения проходят через «ProxySelector», является детальностью реализации. Какое тебе дело? У вас есть * реальная проблема? – EJP

ответ