Java 应该自动检测 IPv4/IPv6 吗?

Should Java automatically detect IPv4/IPv6?

我有一个内置的 PHP HTTP 服务器启动为

php -S localhost:8080

它显然使用 IPv6 进行监听:

tcp6   0   0  ::1:8080    :::*    LISTEN      2642/php

使用 java.net.HttpURLConnection 我尝试连接到它。但是我得到了例外 java.net.ConnectException: Connection refused.

一旦我这样做 System.setProperty("java.net.preferIPv6Addresses", "true"); 当然,一切正常。不过,这对我来说似乎是一个黑客。 Java 实施应该使用默认设置。

问题:为什么 Java 没有检测到正确的 Internet 协议?这是错误还是我的 OS (Linux) 配置错误?

Java(至少 Oracle 或 OpenJDK 最多 Java 8)没有正确实现地址选择。不久前我在 net-dev mailinglist 上提出了这个问题,但没有太多关注。

默认模式是首选 dualstack/IPv6 地址系列,但首选连接到 IPv4 地址。这是您可以使用 preferIPv6Addresses=true 影响的内容。根据 (old) IPV6 guide for Java 这是出于兼容性原因的决定。

在您的情况下,您可以连接到“::1”IPv6 文字或添加一个现在的 localhost6 别名(因为它也适用于没有 ipv4 地址的地址条目)。

特别是 "localhost" 那里有很多配置错误的系统。