使用主机名的 HttpURLConnection 和 INetAddress 失败,而 IPv6 工作正常
HttpURLConnection and INetAddress using hostname fails while IPv6 works fine
所以最初,我想通过 HTTP GET 使用 URL(如“http://myhostname:123/path/to/file”)访问文件。我的浏览器可以毫无问题地访问它,所以下一步是从 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"写入 header.
InetAddress.getByName("myhostname").isReachable(5000)
效果不佳,但适用于 IPv6。
在 cmd.exe 上使用 ping 命令时,我可以成功 ping "ping myhostname"。我有一些 C# 代码,在使用 "myhostname" 时也能正常运行。 但为什么它在 Java 中不起作用,我需要做什么才能使其正常运行?
注意:我想访问的主机是我电脑上的虚拟机运行。由于我没有网络编程方面的经验,这可能是我遗漏的一件简单的事情。
好吧,我可以解决我的问题:
正如@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 测试。
所以最初,我想通过 HTTP GET 使用 URL(如“http://myhostname:123/path/to/file”)访问文件。我的浏览器可以毫无问题地访问它,所以下一步是从 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"写入 header.
InetAddress.getByName("myhostname").isReachable(5000)
效果不佳,但适用于 IPv6。
在 cmd.exe 上使用 ping 命令时,我可以成功 ping "ping myhostname"。我有一些 C# 代码,在使用 "myhostname" 时也能正常运行。 但为什么它在 Java 中不起作用,我需要做什么才能使其正常运行?
注意:我想访问的主机是我电脑上的虚拟机运行。由于我没有网络编程方面的经验,这可能是我遗漏的一件简单的事情。
好吧,我可以解决我的问题:
正如@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 测试。