【发布时间】:2015-05-20 03:52:11
【问题描述】:
我有一些仅支持 IPv6 的主机。我可以成功地对其执行 curl 请求 通过卷曲
$ curl -I my.ip.v6.only.host
HTTP/1.1 200 OK
但是当我试图从 java 中获取它时,我遇到了一个错误:
HttpGet httpget = new HttpGet("http://my.ip.v6.only.host");
CloseableHttpResponse response = httpclient.execute(httpget);
堆栈跟踪:
INFO: I/O exception (java.net.NoRouteToHostException) caught when processing request to {}->http://my.ip.v6.only.host: No route to host
Mar 17, 2015 7:42:23 PM org.apache.http.impl.execchain.RetryExec execute
INFO: Retrying request to {}->http://my.ip.v6.only.host
java.net.NoRouteToHostException: No route to host
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:72)
at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:123)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:318)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
at MainTest.main(MainTest.java:25)
java v1.7.0_65 和 v1.8.0_40,MacOS 10.10.2 出现问题。在以前版本的 MacOS 10.9.5 上运行良好。
发生了什么事?主机如何可能被curl 访问而无法从java 访问。
另外,我尝试过使用-Djava.net.preferIPv6Addresses=true 和-Djava.net.preferIPv4Stack=false,但没有用。
UPD 在 OpenJDK 中发现了一个相关的错误,JDK-8015415
UPD 2 当我尝试使用有线连接而不是 wifi 时,它帮助了我。很奇怪。
【问题讨论】:
-
您使用的是什么版本的 Apache Http Client?
-
org.apache.httpcomponents:httpclient:4.3.5
-
尝试过正常的 Java NIO 请求了吗?我似乎无法在 Linux box atm 上重现此问题。
-
@MichaelHampton,当然是在线托管,因为它可以通过 curl 获得。
标签: java httpclient osx-yosemite ipv6