2013-05-21 35 views
1

我有一個在JVM/Tomcat上運行的應用程序,它運行的機器都啓用了IPv6堆棧。我試圖向另一臺僅支持IPv4的機器發出請求,JVM將始終偏好IPv6堆棧發出此請求(我使用Apache HttpClient類來發出請求)。如何讓JVM在隔離範圍內使用IPv4堆棧?

我知道-Djava.net.preferIPv4Stack=true屬性,但由於我不會在這裏介紹的原因,當JVM啓動時我無法傳遞它。我甚至無法將其編程(的時間,短週期),像這樣:

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

...因爲這會潛在地影響對JVM/Tomcat實例運行其他的線程(因爲我從this question理解並其他)。

所以問題是,我該如何讓這個單一請求通過IPv4堆棧(意味着實際使用IPv4接口,而不僅僅是連接到IPv4端點)?

我想過使用cURL(通過exec或通過libcurl綁定),因爲curl完全不使用JVM。

還有其他想法嗎?

+0

會通過代理進行選擇嗎?我通常使用SOCKS代理。 –

+0

事情是,我試圖連接到的機器實際上是一個代理,但它只適用於IPv4(舊代理)。設置另一個代理是不可能的。再次,我很抱歉這些荒謬的限制,但這是我必須與之合作。 –

+0

只有用於測試的網絡訪問的額外程序不正常?代理選擇器是否只是這個請求的一個選項? http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html –

回答

1

柔版的提到這是有效的!

最終我意識到真正的問題不在於JVM將請求形成IPv6接口,這是不可能的,因爲代理只會有一個DNS條目(如Flexo指出的那樣)。

真正的問題是代理URL中的拼寫錯誤,導致JVM無法解析代理主機;拋棄我的原因是異常是從Inet6Address類中拋出的(可能是因爲JVM還不知道代理只是IPv4的事實)。

我修正了錯字!現在代理已經正確解析,並且請求是通過IPv4完成的。謝謝!