Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在IPv6正常工作时,使用主机名的HttpURLConnection和INetAddress失败_Java_Network Programming_Httpurlconnection_Ipv6_Hostname - Fatal编程技术网

Java 在IPv6正常工作时,使用主机名的HttpURLConnection和INetAddress失败

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通过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中工作,我需要做什么才能使它正常工作呢


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

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

正如@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”)如果运行
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——不管它如何工作——似乎是我目前的重点。非常感谢。