Реальная проблема заключается в том, что Java предполагает, что проверка «Использовать тот же прокси-сервер для всех протоколов» также влияет на прокси-сервер SOCKS (я не знаю логики этого диалога в Windows, но это, по крайней мере, запутывает) Если проверка установлена, вы получаете прокси-серверы как для HTTP, так и для SOCKS, что вряд ли будет желательной конфигурацией. Один из способов решить это снятие отметки проверка и выход из поля SOCKS.
Наконец-то я решил создать прокси-фильтр, который сначала вызывает селектор по умолчанию, и если он найдет ту же конфигурацию для соединений 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, определенным кодом (и все эти параметры сценария выглядел плохо, тоже)
Вот что я подумал. Некоторые люди предложили обходное решение, которое связано с перегрузкой класса DefaultProxySelector, который я собираюсь попробовать. – Demiurg
ZZ Coder, есть ли у вас ссылка на эту «ошибку Java», о которой вы говорили, чтобы я мог найти дополнительную информацию? Откуда вы получили информацию? Была ли эта ошибка подана в Oracle? –
Это правильный ответ (дополняющий другой ответ на переопределение селектора прокси-сервера по умолчанию), но он может использовать больше объяснений. Я отредактировал ответ, чтобы уточнить, что нужно _запустить параметр «Пользователь того же прокси-сервера для всех протоколов», чтобы он не был выбран. –