1

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

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

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

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

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

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

还有其他想法吗?

4

1 回答 1

1

柔印提到这是有效的!

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

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

我修正了错字!现在代理已正确解析,请求是通过 IPv4 发出的。谢谢!

于 2013-05-22T13:18:56.173 回答