如何为SOCKS代理设置nonProxyHosts

时间:2014-08-22 11:24:55

标签: java proxy localhost socks

我想为SOCKS5代理设置nonProxyHosts列表,即应该使用直接连接的主机名列表。

正如oracle docs所述,有一些名为http.nonProxyHostsftp.nonProxyHosts的选项可以为HTTP和FTP设置代理排除,但SOCKS代理没有特定的设置。

我尝试http.nonProxyHosts,但这并不会影响SOCKS连接。

SOCKS代理通过以下方式设置:

System.setProperty("socksProxyHost", "192.168.10.10");
System.setProperty("socksProxyPort", "3128");

但是这导致即使到localhost的数据库连接也在使用SOCKS代理,这是不可接受的。

这应该如何使用?如何从代理连接中排除某些主机?

1 个答案:

答案 0 :(得分:10)

Java网络属性的documentation说明了这一点:

  

以这种方式指定SOCKS代理后,将通过代理尝试所有 TCP连接。

(强调补充)

没有规定通过socks属性设置非代理主机。


您可以使用Proxy和/或ProxySelector类,但是:

  • ProxySelector仅适用于您的应用使用URLConnection建立关联的情况。

  • Proxy适用于任意套接字......但前提是您可以将Proxy对象作为参数提供给相关的Socket构造函数调用。 (根据您的代码尝试连接的内容,您需要逻辑来提供不同的Proxy个对象。)


对此有一个出色的RFE:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=5001942

该票证明了另一种解决方法。显然,如果java.net.useSystemProxies属性为true,则(在某些平台上)默认代理选择器将尊重排除在相应系统代理设置中指定的主机。