如何使JVM在隔离范围内使用IPv4堆栈?

时间:2013-05-21 05:41:41

标签: java jvm httpclient ipv6 ipv4

我有一个在JVM / Tomcat上运行的应用程序,并且它运行的所有机器都启用了IPv6堆栈。我正在尝试向另一台仅支持IPv4的计算机发出请求,而JVM总是更喜欢使用IPv6堆栈来发出此请求(我正在使用Apache HttpClient类来发出请求。)

我知道-Djava.net.preferIPv4Stack=true属性,但由于我不会在这里讨论的原因,我无法在JVM启动时传递它。我甚至无法以编程方式(在很短的时间内)设置它:

System.setProperty("java.net.preferIPv4Stack", "true");

...因为这可能会影响在JVM / Tomcat实例上运行的其他线程(正如我从this question和其他人那样了解)。

所以问题是,如何让这个单一请求通过IPv4堆栈(意味着实际使用IPv4接口,而不仅仅是连接到IPv4端点)?

我考虑过使用cURL(通过exec或通过libcurl绑定),因为curl根本不使用JVM。

还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

Flexo提到这是有效的!

最终我意识到真正的问题不是JVM会将请求形成IPv6接口,这是不可能的,因为代理只会有一个A DNS条目(正如Flexo指出的那样)。

真正的问题是代理URL中的拼写错误,这使得JVM无法解析代理主机;让我失望的是从Inet6Address类抛出异常的事实(可能是因为JVM还不知道代理只是IPv4的事实)。

我修正了错字!现在代理已正确解析,请求通过IPv4进行。谢谢!