С тех пор, как я перешел на Yosemite, я заметил, что попытки разрешить локальный хост в моей домашней сети занимали много времени (иногда более минуты), поэтому я решил попробовать и выяснить, почему.
Вот как выглядел мой исходный файл / etc / hosts, исходя из предположения, что имя хоста моей машины было teetotal :
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
$ cat /etc/hosts### Host Database## localhost is used to configure the loopback interface# when the system is booting. Do not change this entry.##127.0.0.1 localhost255.255.255.255 broadcasthost::1 localhost#fe80::1%lo0 localhost127.0.0.1 wuqour.local127.0.0.1 teetotal |
Я настроил небольшой тест, который повторил проблему:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
import java.net.InetAddress;import java.net.UnknownHostException; public class LocalhostResolution{ public static void main( String[] args ) throws UnknownHostException { long start = System.currentTimeMillis(); InetAddress localHost = InetAddress.getLocalHost(); System.out.println(localHost); System.out.println(System.currentTimeMillis() - start); }} |
который имеет следующий вывод:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
Exception in thread "main" java.net.UnknownHostException: teetotal-2: teetotal-2: nodename nor servname provided, or not known at java.net.InetAddress.getLocalHost(InetAddress.java:1473) at LocalhostResolution.main(LocalhostResolution.java:9) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)Caused by: java.net.UnknownHostException: teetotal-2: nodename nor servname provided, or not known at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:901) at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1293) at java.net.InetAddress.getLocalHost(InetAddress.java:1469) ... 6 more |
Каким-то образом мое имя хоста изменилось на teetotal-2, поэтому я добавил следующую запись в / etc / hosts :
|
1
|
127.0.0.1 teetotal-2 |
Теперь, если мы запустим программу, мы увидим этот вывод:
|
1
2
|
teetotal-2/127.0.0.15011 |
Это все еще занимает 5 секунд, чтобы решить, что намного дольше, чем я ожидал. После перерыва, указывающего на код, кажется, что он пытается выполнить разрешение IPv6, а не IPv4, поэтому я добавил для этого также запись / etc / hosts :
|
1
|
::1 teetotal-2 |
Теперь разрешение гораздо быстрее:
|
1
2
|
teetotal-2/127.0.0.16 |
Счастливые дни!
| Ссылка: | InetAddressImpl # lookupAllHostAddr медленно / зависает от нашего партнера по JCG Марка Нидхэма в блоге Марка Нидхэма . |