ここで提案されたコードを試してみると、奇妙な動作が見つかりました。
デフォルトの ProxySelector が設定された後、通常のソケット コード (たとえば、新しいソケットの作成) は、ソックス サーバーを使用しようとするため、機能しなくなったようです (なぜこれを行うのかはわかりませんが、私にとってはそうです)。 .
ですから、あなたが電話をかけるとき
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 を null に戻してみてください。
ProxySelector.setDefault(null);
私にとっては、これにより次の小さな Java クラスが作成されました。これを使用して、システムのプロキシ設定を取得するだけで、アプリケーションの Sockets() の使用に影響を与えることなく、プロキシを使用するようにシステムを適切に構成できます。
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;
}
}