Java 在IPv6正常工作时,使用主机名的HttpURLConnection和INetAddress失败
因此,最初,我希望使用类似“”的URL通过HTTP GET访问文件。我的浏览器可以毫无问题地访问它,所以下一步就是从java代码中获取它Java 在IPv6正常工作时,使用主机名的HttpURLConnection和INetAddress失败,java,network-programming,httpurlconnection,ipv6,hostname,Java,Network Programming,Httpurlconnection,Ipv6,Hostname,因此,最初,我希望使用类似“”的URL通过HTTP GET访问文件。我的浏览器可以毫无问题地访问它,所以下一步就是从java代码中获取它 URL url = new URL("http","myhostname",123,"path/to/file"); URLConnection openConnection = url.openConnection(); HttpURLConnection asHttp = (HttpURLConnection) openConnec
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中工作,我需要做什么才能使它正常工作呢
注意:我想要访问的主机是在我的电脑上运行的虚拟机。由于我没有网络编程经验,这可能是我缺少的一件简单的事情。好的,我可以解决我的问题: 正如@Andreas建议的那样,我尝试了ping-4myhostname,并且解析了IPv4地址,但是ping超时了。 我通过在
C:\Windows\System32\drivers\etc
中编辑主机文件解决了这个问题,并添加了行1234::1234:1234:1234%2 myhostname
。我重新检查了ping-4myhostname
,但现在它没有解析地址,而pingmyhostname
在使用IPv6时工作正常。我的Java代码马上就能完美运行
我还使用
System.setProperty(“java.net.preferipv6address”,“true”)它是通过一个简单的main()方法实现的,但不是通过JUnit测试实现的。如果运行ping myhostname
,它会ping IPv4还是IPv6?我假设是IPv6,所以运行ping-6myhostname
会得到相同的结果。如果然后运行ping-4 myhostname
,是否正确ping IPv4?如果DNS同时返回IPv4和IPv6地址,但IPv4地址不起作用,请修复DNS,因为默认情况下Java将使用IPv4地址。默认情况下,浏览器和C#程序可能使用IPv6地址。使用哪一个并不重要,因为如果DNS同时返回这两个,那么它们都应该工作。解决方法:告诉Java使用IPv6地址。请参阅:@Andreas Yes,ping myhostname
pings IPv6。我尝试System.setProperty(“java.net.preferipv6address”,“true”)已经失败代码>。。。我不太确定是超时还是其他异常。我以后再检查。我刚刚读到有一个使用jvm参数的“防弹”版本,我也必须检查它。尽管如此,正如你所说,这将是一个解决办法,所以修复DNS——不管它如何工作——似乎是我目前的重点。非常感谢。