如何为SOCKS代理设置非代理主机?

20

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

正如oracle文档所述,有名为http.nonProxyHostsftp.nonProxyHosts的选项可用于设置HTTP和FTP的代理排除设置,但没有特定的设置来针对SOCKS代理进行设置。

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

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

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

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

那么这应该如何使用呢?我如何排除某些主机不受代理连接的影响?


2
我需要相同的功能。我担心对于SOCKS来说,nonProxyHosts目前还没有被实现。 - Nealvs
1个回答

25

使用socksNonProxyHosts系统属性; 这是未经记录的,但在Oracle JDK 8至11中存在,并且可能也存在于其他版本中。

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

简短概述:

属性socksNonProxyHostssun.net.spi.DefaultProxySelector源代码中可以找到(感谢@rince)。

然而,Java网络属性的文档暗示该属性不存在,因此使用可能不稳定:

一旦以这种方式指定了SOCKS代理,所有TCP连接都将尝试通过该代理进行。

(已加重)

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

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

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

对于此RFE,有一个错误。 该票务建议另一种解决方法。 显然,如果java.net.useSystemProxies属性为true,则(在某些平台上)默认代理选择器将尊重在适当的系统代理设置中指定的排除主机。


对于其他读者来说,看起来这个问题在Java 8(b86)中已经修复了。 - xdhmoore
@xdhmoore,你能给我指一些关于这个 bug 修复的文档吗? - Tucker
1
@Tucker,这是上面链接的那个。 - xdhmoore
3
这个错误没有直接指明属性名称,你需要去源代码中查找DefaultProxySelector。 该属性的名称是socksNonProxyHosts。 - rince
1
事实上,截至Java 9发布时,他们仍未在https://docs.oracle.com/javase/9/docs/api/java/net/doc-files/net-properties.html中记录此属性。 - Stephen C
ProxySelector 用于为我创建 Socket 实例(Java 1.7)。 - 4esn0k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接