2013-05-05 2 views
2

Я пытаюсь настроить программу Java, где каждый поток может использовать свой собственный прокси.Каждый поток, используя свой собственный прокси

Прямо сейчас я нашел способ установить прокси-сервер по всему миру. (http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html)

Как уже упоминалось ранее, эти параметры влияют на все соединения HTTP в течение всего срока службы VM вызываются с этими параметрами. Однако можно использовать метод System.setProperty(), чтобы иметь несколько более динамичное поведение.

Вот фрагмент кода, показывающий, как это можно сделать:

// Установите HTTP прокси webcache.mydomain.com:8080

System.setProperty ("http.proxyHost", «Webcache .mydomain.com "); System.setPropery («http.proxyPort», «8080»);

Update

Я попытался с помощью прокси-класс, но не может создать прямое соединение для того, когда я не хочу использовать указанный прокси-сервер:

private void setProxy() 
{ 
    if(proxyUrl != null) 
    { 
     SocketAddress addr = new InetSocketAddress(proxyUrl, proxyPort); 
     proxy = new Proxy(Proxy.Type.HTTP, addr); 
    } 
    else 
    { 
     proxy = new Proxy(Proxy.Type.DIRECT, null); 
    }  
} 

Exception in .... java.lang.IllegalArgumentException: type DIRECT is not compatible with address null

Как я могу заставить это работать для прямых соединений? Еще не пробовал прокси.

ответ

6

Возможно использовать Proxy класс, как описано here в разделе 3:

Как мы уже видели, свойства системы являются мощным, но не гибкой. Поведение «все или ничего» по праву считалось слишком суровым, ограничение большинства разработчиков было . Именно поэтому было решено ввести новый, более гибкий API в J2SE 5.0, чтобы было возможно, что имеют настройки прокси-сервера на основе подключения.

Вы можете использовать Proxy.NO_PROXY для:

... не использовать прокси.

ли что-то вроде этого:

private void setProxy() 
{ 
    if(proxyUrl != null) 
    { 
     SocketAddress addr = new InetSocketAddress(proxyUrl, proxyPort); 
     proxy = new Proxy(Proxy.Type.HTTP, addr); 
    } 
    else 
    { 
     proxy = Proxy.NO_PROXY; 
    }  
} 
+0

Ну, я чувствую себя очень глупо, не проверяя всю страницу – Wurstbro

+0

еще несколько часов, пока я не буду иметь возможность попробовать, что – Wurstbro

+0

я обновил мой вопрос, может быть, вы можете помочь – Wurstbro

0

решение Barry Н.Л. полу работал, так как я не мог понять, как не использовать прокси-сервер с этим решением.

То, что я придумал:

proxyUrl и proxyPort в конструкторе моего класса.

Я не был в состоянии назвать url.openConnection(proxy);, если я просто установить proxy = null

или proxy = new Proxy(Proxy.Type.DIRECT, null);. Поэтому я написал свой собственный openConnection

private void setProxy() 
{ 
    if(proxyUrl != null) 
    { 
     SocketAddress addr = new InetSocketAddress(proxyUrl, proxyPort); 
     proxy = new Proxy(Proxy.Type.HTTP, addr); 
    } 
    else 
    { 
     proxy = null; 
    }  
} 
private URLConnection openConnection2(URL url) 
{ 
    try { 
     if(proxy != null)    
      return url.openConnection(proxy);    
     else 
      return url.openConnection();    
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     return null; 
    } 
} 

setProxy() должен вызываться перед выполнением любых соединений.

Также я заменил

url = new URL(http_url); 
con = (HttpURLConnection)url.openConnection(proxy); 

с

url = new URL(http_url); 
con = (HttpURLConnection)openConnection2(url); 
+0

Я обновил свой ответ с решением вашего обновленного вопроса. Я думаю, что это официальный способ сделать это, и в результате получается более чистый код (меньше ifs). –

+0

Я пробовал его с DIRECT, не знал, что есть NO_PROXY. Я проверю его позже, хорошо выглядит. Я принял ваш ответ. – Wurstbro

Смежные вопросы