【问题标题】:HttpURLConnection and INetAddress using hostname fails while IPv6 works fine使用主机名的 HttpURLConnection 和 INetAddress 失败,而 IPv6 工作正常
【发布时间】:2017-04-02 17:23:53
【问题描述】:

所以最初,我想使用“http://myhostname:123/path/to/file”之类的 URL 通过 HTTP GET 访问文件。我的浏览器可以毫无问题地访问它,所以下一步是从 java 代码中获取它。

    URL url = new URL("http","myhostname",123,"path/to/file");
    URLConnection openConnection = url.openConnection();
    HttpURLConnection asHttp = (HttpURLConnection) openConnection;
    assertEquals(200, asHttp.getResponseCode());

很遗憾,我遇到了超时。我正在使用 Wireshark 进行嗅探,但看不到通过网络发送的请求。

然后我用 IPv6 地址尝试了完全相同的 URL,我可以看到请求通过网络传输,但服务器以 HTTP 400 响应,因为他不喜欢看到“myhostname”写入标头。

InetAddress.getByName("myhostname").isReachable(5000) 不能正常工作,但可以使用 IPv6。 在 cmd.exe 上使用 ping 命令时,我可以使用“ping myhostname”成功 ping。我有一些 C# 代码,在使用“myhostname”时也可以正常运行。 但是为什么它不能在 Java 中工作,我需要做什么才能使其正常工作?

注意:我想要访问的主机是在我的电脑上运行的虚拟机。由于我在网络编程方面没有经验,这可能是我缺少的一件简单的事情。

【问题讨论】:

  • 如果您运行ping myhostname,它会ping IPv4 还是IPv6?我假设是 IPv6,所以运行 ping -6 myhostname 会得到相同的结果。如果您随后运行ping -4 myhostname,它是否正确 ping IPv4?
  • 如果您的 DNS 同时返回 IPv4 和 IPv6 地址,但 IPv4 地址不起作用,请修复 DNS,因为 Java 将默认使用 IPv4 地址。浏览器和 C# 程序可能默认使用 IPv6 地址。使用哪一个无关紧要,因为如果 DNS 两者都返回,它们应该都可以工作。 解决方法: 告诉 Java 使用 IPv6 地址。见:Java - How can I prefer IPv6?
  • @Andreas 是的,ping myhostname ping IPv6。我尝试System.setProperty("java.net.preferIPv6Addresses", "true"); 已经失败了……我不太确定它是否仍然是超时或其他异常。我稍后再检查。我刚刚读到有一个使用 jvm-arguments 的“防弹”版本,也必须检查一下。尽管如此,这将是一种解决方法-正如您所说-因此修复DNS-无论如何有效-似乎是我现在关注的重点。谢谢。

标签: java network-programming httpurlconnection ipv6 hostname


【解决方案1】:

好吧,我可以解决我的问题:

正如@Andreas 建议的那样,我尝试了ping -4 myhostname 并解析了 IPv4 地址,但 ping 超时。 我通过编辑C:\Windows\System32\drivers\etc 中的主机文件并添加了1234::1234:1234:1234:1234%2 myhostname 行解决了这个问题。我重新检查了ping -4 myhostname,但现在它没有解析地址,而ping myhostname 使用 IPv6 可以正常工作。我的 Java 代码立即完美运行。

我还使用System.setProperty("java.net.preferIPv6Addresses", "true"); 重试,它通过一个简单的 main() 方法运行,但它不适用于 JUnit-Test。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2014-11-02
    • 2018-01-30
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 2015-06-03
    相关资源
    最近更新 更多