【问题标题】:Should Java automatically detect IPv4/IPv6?Java 应该自动检测 IPv4/IPv6 吗?
【发布时间】:2016-04-04 22:44:35
【问题描述】:

我有一个内置的 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 协议?是错误还是我的操作系统 (Linux) 配置错误?

【问题讨论】:

  • 这是一个很好的问题,我很想知道为什么 Java 没有更忠实地遵循现有的约定。似乎这些在每个平台上都重新实现为粗略近似cr.openjdk.java.net/~michaelm/7120875/webrev.3/src/macosx/…
  • 嗯。奇怪的。 Gist: This program 在 Mac 上对我来说似乎工作正常(服务器使用 IPv6)。上述属性为null
  • 该主机涉及的 DNS 记录有哪些?会不会是一个非功能性 IP4 地址的 A 记录?

标签: java ipv6 ipv4


【解决方案1】:

Java(至少是 Java 8 之前的 Oracle 或 OpenJDK)无法正确实现地址选择。我在net-dev mailinglist 上提出了一段时间,但没有太大的吸引力。

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

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

尤其是对于“本地主机”,无论如何,很多配置错误的系统都在那里。

【讨论】:

猜你喜欢
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 2015-03-10
相关资源
最近更新 更多