网络上很多什么,ping一下看看, netstat看看端口通不通,请求头模拟浏览器的User-Agent
等,不能说他们这么排除没一点用,只能说基本没有一个行得通的。
因为什么端口不通, 防火墙没开这些,那浏览器又是如何能正常访问的?
所以逼得大家(包括我)各种网上搜解决方法的, 肯定不是上面的几种简单的情况。
解决
- 如果是idea中启动的程序,java请求不通的,在启动配置中,加上这个jvm参数:
-Djava.net.preferIPv4Stack=true
- 如果是idea本身某个配置连不上,比如docker的2375端口tcp远程url配置一直报timeout超时的,则要修改idea的vm。
help —> Edit custom vm options
在最后加上-Djava.net.preferIPv4Stack=true
即可。
然后重启idea, 要关闭所有的idea项目,否则不算重启idea
原因
java在双协议栈机器上, 默认优先使用ipv6.
java.net.preferIPv4Stack(默认值false)
官方文档: https://docs.oracle.com/javase/8/docs/technotes/guides/net/ipv6_guide/#how_ipv6_works
IPv6-Related System Properties
Ipv6相关的系统特性
On dual stack machines, system properties are provided for setting the preferred protocol stack—IPv4 or IPv6—as well as the preferred address family types—inet4 or inet6.
在双协议栈机器上,提供了系统属性来设置首选协议栈 ipv4或 ipv6以及首选地址族类型 inet4或 inet6。
IPv6 stack is preferred by default, since on a dual-stack machine IPv6 socket can talk to both IPv4 and IPv6 peers.
默认情况下,IPv6协议栈是首选的,因为在双协议栈机器上,IPv6套接字可以与 IPv4和 IPv6同行通信。
This setting can be changed through the java.net.preferIPv4Stack=<true|false> system property.
这个设置可以通过 java.net.preferIPv4Stack = < true | false > 属性来更改。
By default, IPv4 addresses are preferred over IPv6 addresses, for example, when querying the name service (for instance, DNS service), IPv4 addresses would be returned ahead of IPv6 addresses. There are two reasons for this choice:
默认情况下,IPv4地址比 IPv6地址更受欢迎,例如,当查询名称服务(例如 DNS 服务)时,IPv4地址会比 IPv6地址更早返回。这种选择有两个原因:
There are some applications that expect an IPv4 address textual format, for example %d.%d.%d.%d,
有些应用程序需要 IPv4地址文本格式,例如,%d.%d.%d.%d
. Using an IPv4 address minimizes the surprises. 。使用 IPv4地址可以减少意外
Using IPv4 address, one call (with an IPv6 socket) can be used to reach either a legacy IPv4-only service, or an IPv6 service (unless the IPv6 service is on a Ipv6 only node).使用 IPv4地址,一个呼叫(带有一个 IPv6套接字)可以用于传统的 IPv4专用服务或 IPv6服务(除非 IPv6服务是 IPv6专用节点)
This setting can be changed through the system property java.net.preferIPv6Addresses=<true|false>
这个设置可以通过系统属性 java.net.preferIPv6Addresses = < true | false > 更改