2016-11-18 18 views
0

所以最初,我想通过HTTP GET使用URL“http://myhostname:123/path/to/file”来访问文件。我的浏览器可以毫无问题地访问它,所以下一步就是将它从Java代码中取出。当IPv6工作正常时,HttpURLConnection和INetAddress使用主机名失败

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中工作,我需要做些什么才能使它运行?

注意:我想要访问的主机是在我的电脑上运行的虚拟机。由于我没有在网络编程方面经验丰富,所以我可能很简单,但我错过了。

+0

如果您运行'ping myhostname',是否可以ping IPv4或IPv6?我将假设IPv6,所以运行'ping-6 myhostname'会得到相同的结果。如果你然后运行'ping -4 myhostname',它是否正确ping IPv4? – Andreas

+0

如果您的DNS同时返回IPv4和IPv6地址,但IPv4地址不起作用,请修复DNS,因为默认情况下*将使用IPv4地址。浏览器和C#程序默认使用IPv6地址。不管你使用哪一个都不重要,因为如果DNS同时返回,它们都应该可以工作。 *解决方法:*告诉Java使用IPv6地址。请参阅:[Java - 我该如何选择IPv6?](http://stackoverflow.com/q/19314241/5221149) – Andreas

+0

@Andreas是的,'ping myhostname' ping IPv6。我已经尝试过'System.setProperty(“java.net.preferIPv6Addresses”,“true”);'...我不太确定它是否仍然是超时或不同的异常。我稍后重新检查。我刚刚读到使用jvm参数有一个“防弹”版本,必须检查。尽管如此,这将是一个解决方法 - 正如你所说的那样 - 所以修复DNS - 无论如何起作用 - 似乎现在是我的焦点。谢谢。 – Bastian

回答

1

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

由于@Andreas建议我尝试ping -4 myhostname和IPv4地址得到解决,但平超时。 我通过编辑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。

相关问题