使用以下代码:
try {
System.out.println(new Date());
InetAddress hostName = InetAddress.getLocalHost();
System.out.println(new Date());
} catch (UnknownHostException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
Thu Oct 22 20:58:22 BST 2015
Thu Oct 22 20:58:52 BST 2015
Run Code Online (Sandbox Code Playgroud)
换句话说,执行30秒.Machine是2015 Macbook Pro with Java 1.8.0_60.
为什么这需要这么长时间?
imr*_*ole 118
可以通过在/ etc/hosts中添加以下内容来解决该问题(假设主机名为macbook:
127.0.0.1 macbook
::1 macbook
Run Code Online (Sandbox Code Playgroud)
这会将时间返回到更合适的时间(<1秒)
Oct*_* R. 16
使用Java8在MacOS Sierra上出现此问题,更新等于或大于60(jdk1.8.0_60.jdk,jdk1.8.0_77.jdk等).
解决方案可以在这里找到:https://github.com/thoeni/inetTester.
这是我的/ etc/hosts文件的内容:
127.0.0.1 localhost mac.local
::1 localhost mac.local
Run Code Online (Sandbox Code Playgroud)
就我而言,mac是我的电脑名称.
上面的答案适用于我的mac,你可以这样尝试:
第一步,从thoeni/inetTester下载inetTester.jar
第 2 步,在您的 Mac 上运行它。这是我的 mac 上的结果:
$ java -jar ./inetTester.jar
Calling the hostname resolution method...
Method called, hostname MacBook-Pro.local, elapsed time: 5009 (ms)
Run Code Online (Sandbox Code Playgroud)
运行测试需要 5 秒,它显示了我的 mac 的主机名。
第三步,修改/etc/hosts:
127.0.0.1 MacBook-Pro.local
::1 MacBook-Pro.local
Run Code Online (Sandbox Code Playgroud)
主机是第 2 步中显示的内容。在此之后,再次运行测试:
$ java -jar ./inetTester.jar
Calling the hostname resolution method...
Method called, hostname MacBook-Pro.local, elapsed time: 6 (ms)
Run Code Online (Sandbox Code Playgroud)
是的,它只有 6 毫秒。
我怀疑这里的延迟是由于尝试DNS解析失败.也许您的DNS服务器配置不正确.30秒可能代表DNS解析的超时.
您的解决方案提高速度的原因是,将条目添加到hosts文件允许在本地解析主机名,从而跳过尝试针对实际(远程)DNS服务器解析主机名.
编辑:您可能想知道为什么这种方法可以完成任何主机解析.显然,它是内置于Java网络库的反欺骗机制的一部分.有关更多详细信息,请参阅此帖子的已接受答案:InetAddress.getCanonicalHostName()返回IP而不是Hostname
| 归档时间: |
|
| 查看次数: |
12887 次 |
| 最近记录: |