Java 如何为SOCKS代理设置非ProxyHosts?

Java 如何为SOCKS代理设置非ProxyHosts?,java,proxy,localhost,socks,Java,Proxy,Localhost,Socks,我想为SOCKS5代理设置非代理主机列表,即应使用直接连接的主机名列表 如前所述,有名为http.nonProxyHosts和ftp.nonProxyHosts的选项可用于设置http和ftp的代理排除,但没有针对SOCKS代理的特定设置 我尝试了http.nonProxyHosts,但这不会影响SOCKS连接 SOCKS代理通过以下方式设置: System.setProperty("socksProxyHost", "192.168.10.10"); System.setProperty("s

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

如前所述,有名为
http.nonProxyHosts
ftp.nonProxyHosts
的选项可用于设置http和ftp的代理排除,但没有针对SOCKS代理的特定设置

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

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

System.setProperty("socksProxyHost", "192.168.10.10");
System.setProperty("socksProxyPort", "3128");
但这会导致连到
localhost
的DB连接都使用SOCKS代理,这是不可接受的


这个怎么用?如何从代理连接中排除某些主机?

使用
socksNonProxyHosts
系统属性;这没有文档记录,但存在于Oracle JDK 8到11中,可能还有其他版本

java-DsocksProxyHost=mySocksServer-DsocksProxyPort=8888-DsocksNonProxyHosts=127.0.0.1[…]

TL;博士

属性
socksNonProxyHosts
可在的源代码中找到(感谢@rince)

但是,Java networking属性的默认值意味着它不存在,因此它的使用可能不稳定:

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

(增加重点)

您可能可以使用
代理
和/或
代理选择器
类,但是:

  • ProxySelector
    仅适用于应用程序使用
    URLConnection
    建立连接的情况

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


有一个。这张罚单提出了另一种解决办法。显然,如果
java.net.useSystemProxies
属性为
true
,则(在某些平台上)默认代理选择器将考虑在适当的系统代理设置中指定的排除主机。

我需要相同的功能。恐怕SOCKS的非ProxyHosts目前尚未实现。对于其他阅读本文的人来说,该漏洞似乎已针对Java 8(b86)修复。@xdhmoore您能给我指一些关于该漏洞修复的文档吗?@Tucker它是上面链接的。该漏洞未命名实际属性,您必须在源代码中查找DefaultProxySelector。该属性是socksnonproxyhostsindect,截至Java 9发行版,他们还没有在中记录该属性