Я обнаружил странное поведение, экспериментирующее с предлагаемым кодом здесь.
Похоже, что после установки ProxySelector по умолчанию обычный код сокета (например, создание нового сокета) больше не работает, потому что он пытается использовать сервер socks (не уверен, почему он это сделал, но для меня оно делает).
Так что если вы при звонке
Socket socket = new Socket(host, port);
вы получаете такое SocketException:
java.net.SocketException: Malformed reply from SOCKS server
at java.net.SocksSocketImpl.readSocksReply(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
, затем попробуйте установить значение по умолчанию ProxySelector равным нулю:
ProxySelector.setDefault(null);
Для меня это привело к следующему небольшому классу Java, который я теперь использую, чтобы просто получить настройки прокси-сервера системы, не влияя на дальнейшее использование Sockets () приложения, и в то же время правильно настроить систему для использования прокси: 1014 *
public class ProxyConfig {
private static String host;
private static int port;
public static void init() {
System.setProperty("java.net.useSystemProxies", "true");
Proxy proxy = getProxy();
if (proxy != null) {
InetSocketAddress addr = (InetSocketAddress) proxy.address();
host = addr.getHostName();
port = addr.getPort();
System.setProperty("java.net.useSystemProxies", "false");
System.setProperty("http.proxyHost", host);
System.setProperty("http.proxyPort", ""+port);
}
System.setProperty("java.net.useSystemProxies", "false");
}
public static String getHost() {
return host;
}
public static int getPort() {
return port;
}
private static Proxy getProxy() {
List<Proxy> l = null;
try {
ProxySelector def = ProxySelector.getDefault();
l = def.select(new URI("http://foo/bar"));
ProxySelector.setDefault(null);
} catch (Exception e) {
e.printStackTrace();
}
if (l != null) {
for (Iterator<Proxy> iter = l.iterator(); iter.hasNext();) {
java.net.Proxy proxy = iter.next();
return proxy;
}
}
return null;
}
}