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" 那里有很多配置错误的系统。
我有一个内置的 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" 那里有很多配置错误的系统。