Все, что вам нужно сделать устанавливается appropriate system properties перед созданием объекта WebClient
. Например:
System.setProperty("socksProxyHost", "localhost"); // replace "localhost" with your proxy server
System.setProperty("socksProxyPort", "9999"); // replace "9999" with your proxy port number
WebClient client = new WebClient();
На данный момент, HttpClient (который используется HtmlUnit под одеялом) подберет настройки и использовать прокси-сервер SOCKS для всех сетевых коммуникаций.
ОБНОВЛЕНИЕ: Я прочитал ваш пересмотренный вопрос (и ваш комментарий), и я думаю, что вы на правильном пути. Проблема в том, что если вы реализуете шаг 1 с использованием вышеуказанных системных свойств, то ваш код не является потокобезопасным (поскольку эти системные свойства являются глобальными). Одним из решений является синхронизация на чем-то, но, конечно, это может привести к проблемам производительности (может быть, и не важно для вас).
Если вы действительно хотите контролировать это в основе каждого сокета, то я думаю, что вам нужно будет сделать что-то вроде следующего:
- Создание пользовательского
ProtocolSocketFactory
, которая передает java.net.Proxy
объект в Socket
конструктор (как в this example).
- Создать пользовательскую форму
Protocol
, которая использует это ProtocolSocketFactory
.
- Примените это
Protocol
к новым подключениям в своем менеджере соединений, используя HttpConnection.setProtocol()
.
Я действительно не проверял это, но, основываясь на быстром взгляде на исходный код HttpClient 3.1, я думаю, что так оно и будет. Я хотел бы услышать, как вы в конечном итоге решаете эту проблему :-). Удачи!
Как вы в конечном итоге решили эту проблему, имея разные прокси-серверы для разных экземпляров веб-клиента? –
@XCoder, мне не нужно было с htmlunit 2.8 вышел, и он настраивается с той версии – Fluffy
yup! Я тоже нашел его, спасибо за быстрый ответ. –