【发布时间】: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 myhostnameping IPv6。我尝试System.setProperty("java.net.preferIPv6Addresses", "true");已经失败了……我不太确定它是否仍然是超时或其他异常。我稍后再检查。我刚刚读到有一个使用 jvm-arguments 的“防弹”版本,也必须检查一下。尽管如此,这将是一种解决方法-正如您所说-因此修复DNS-无论如何有效-似乎是我现在关注的重点。谢谢。
标签: java network-programming httpurlconnection ipv6 hostname