2013-01-14 13 views
7

Java 7 dodaje nową metodę statyczną do klasy java.net.InetAddress:Co zwraca statyczna właściwość InetAddress.getLoopbackAddress()?

static InetAddress getLoopbackAddress() 
Returns the loopback address. 

Teraz zastanawiam się, jaki adres zostanie zawarta w rezultacie IP4 lub IP6 jeden.

documentation jest nieco mglisty na temat:

InetAddress zwrócone będą reprezentować adres IPv4 loopback, 127.0.0.1 lub adres pętli zwrotnej IPv6 :: 1. Zwrócony adres sprzężenia zwrotnego IPv4 jest tylko jednym z wielu w postaci 127. .. *

Jak Java zdecydować, czy powrócić 127.0.0.1 lub wisiorek IPv6 ::1?

Czy oba są reprezentowane przez ten sam obiekt InetAdress?

Czy wynik jest zawsze taki sam? Czy to zależy od mojej karty sieciowej?

Odpowiedz

4

Po pierwsze, istnieje zasadnicza różnica pomiędzy .getLocalHost() i tym sposobem: .getLocalHost() otrzyma adres zarejestrowaną nazwą maszynowego, natomiast .getLoopbackAddress() zwróci tylko lokalnym, adresu zwrotnego.

Co do zwróconego adresu, zależy od systemu operacyjnego. Można jednak wpływać na JVM do korzystania z protokołu IPv4 na priorytet przekazując -Djava.net.preferIPv4Stack=true do argumentów JVM, lub za pomocą:

System.setProperty("java.net.preferIPv4Stack" , "true"); 
4

Jeśli masz stos IPv6 i Java nie jest skonfigurowany do preferują IPv4, zwróci :: 1.

W przeciwnym razie powróci 127.0.0.1.

+0

Nie jestem pewien, czy to prawda. Przynajmniej w Javie 7 domyślnym ustawieniem jest preferowanie stosu IPv6 **, ale preferowanie adresów IPv4 ** (zauważ różnicę). Oznacza to, że 'InetAddress.getLoopbackAddress()' zwróci domyślnie adres IPv4 na większości nowoczesnych systemów operacyjnych. Istnieją dwie różne właściwości (http://docs.oracle.com/javase/7/docs/technotes/guides/net/ipv6_guide/#ipv6-networking), aby to kontrolować. – peterh

+0

Jestem prawie pewien, że EJP jest całkowicie poprawny, po prostu pominął domniemane "adresy" po "IPv4" w swojej odpowiedzi.Jeśli istnieje stos IPv6 (jest to właściwość, która po przeczytaniu linku jest * usuwana * po ustawieniu preferowanego stosu jako IPv4), ale adresy IPv4 nie są preferowane, to adresy IPv6 będą domyślnie ustawione. – codetaku

6

Uważam, że inne udzielone tu odpowiedzi są błędne.

Java, domyślnie preferuje stos IPv6 (jeśli są dostępne), ale preferuje adresy IPv4. Zwróć uwagę na subtelną różnicę. Jest to kontrolowane przez właściwości systemu java.net.preferIPv4Stack i java.net.preferIPv6Addresses, z których oba mają wartość domyślną false.

W związku z tym, InetAddress.getLoopbackAddress() prawie zawsze zwróci adres IPv4. Musisz ustawić właściwości systemowe java.net.preferIPv6Addresses na true, aby uzyskać adres IPv6.

Nie widzę zależności systemu operacyjnego dla wyniku tej metody w źródłach JDK. Nie mogę myśleć o systemie operacyjnym, w którym Java nie (z ustawieniami domyślnymi) zwróci adres IPv4 dla tej metody.

+0

Czy jesteś pewien, że _preferIPv6Addresses = false_ automatycznie oznacza, że ​​preferuje adresy IPv4? Może to po prostu oznaczać, że nie ma żadnych specjalnych preferencji. – magnattic

+0

@atticae. Przeszedłem przez źródła JDK i sam zrobiłem test. Tak, jestem pewien. Mogę mówić tylko o tym, jak 'java.net.preferIPv6Addresses' stosuje się do wyniku metody' InetAddress.getLoopbackAddress() ', ponieważ jest to tylko dla tej metody, którą wykopałem w kodzie źródłowym. – peterh