我使用100%工作袜子,我无法通过我的应用程序连接。
SocketAddress proxyAddr = new InetSocketAddress("1.1.1.1", 12345);
Proxy pr = new Proxy(Proxy.Type.SOCKS, proxyAddr);
try
{
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection(pr);
con.setConnectTimeout(proxyTimeout * 1000);
con.setReadTimeout(proxyTimeout * 1000);
con.connect();
System.out.println(con.usingProxy());
}
catch(IOException ex)
{
Logger.getLogger(Enter.class.getName()).log(Level.SEVERE, null, ex);
}
那么我做错了什么?如果我将HTTP与某些HTTP代理一起使用,则所有工作都在使用,但不能使用SOCKS。
答案 0 :(得分:17)
这真的很容易。您只需要设置相关的系统属性,然后继续使用常规的HttpConnection。
System.getProperties().put( "proxySet", "true" );
System.getProperties().put( "socksProxyHost", "127.0.0.1" );
System.getProperties().put( "socksProxyPort", "1234" );
答案 1 :(得分:2)
内心深处,HttpClient用于HttpURLConnection。
if ((proxy != null) && (proxy.type() == Proxy.Type.HTTP)) {
sun.net.www.URLConnection.setProxiedHost(host);
privilegedOpenServer((InetSocketAddress) proxy.address());
usingProxy = true;
return;
} else {
// make direct connection
openServer(host, port);
usingProxy = false;
return;
}
在第476行,您可以看到唯一可接受的代理是HTTP代理。否则就会直接连接。
奇怪的是,使用HttpURLConnection并不支持SOCKS代理。更糟糕的是,代码甚至没有使用不受支持的代理,只是忽略了代理!
为什么在本课程至少10年后没有对SOCKS代理的任何支持?'存在无法解释。
答案 2 :(得分:2)
告知" socksProxyHost"和" socksProxyPort" VM参数。
e.g。
java -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=8080 org.example.Main
答案 3 :(得分:0)
或者这个答案:https://stackoverflow.com/a/64649010/5352325
如果知道哪些URI需要去代理,还可以使用低层ProxySelector:https://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html,在每个建立的Socket连接中,可以决定要使用的代理。
它看起来像这样:
public class MyProxySelector extends ProxySelector {
...
public java.util.List<Proxy> select(URI uri) {
...
if (uri is what I need) {
return list of my Proxies
}
...
}
...
}
然后您使用选择器:
public static void main(String[] args) {
MyProxySelector ps = new MyProxySelector(ProxySelector.getDefault());
ProxySelector.setDefault(ps);
// rest of the application
}