2013-01-14 14 views
7

Java 7 aggiunge un nuovo metodo statico alla classe java.net.InetAddress:Cosa restituisce il valore InetAddress.getLoopbackAddress() statico?

static InetAddress getLoopbackAddress() 
Returns the loopback address. 

Ora mi chiedo quale indirizzo sarà contenuta nel risultato, l'IP4 o IP6 uno.

Il documentation è un po 'di nebbia sul tema:

L'InetAddress restituito rappresenterà l'indirizzo IPv4 di loopback, 127.0.0.1, o l'indirizzo di loopback IPv6, :: 1. L'indirizzo di loopback IPv4 restituito è solo uno dei tanti nel modulo 127. .. *

Come fa Java decidere se tornare 127.0.0.1 o il ciondolo IPv6 ::1?

Oppure entrambi sono rappresentati dallo stesso oggetto InetAdress?

Il risultato è sempre lo stesso? Dipende dalle mie schede di rete?

risposta

4

In primo luogo, v'è una differenza fondamentale tra .getLocalHost() e questo metodo: .getLocalHost() riceverà l'indirizzo registrato con il nome della macchina , mentre .getLoopbackAddress() restituirà il solo locale, indirizzo di loopback.

Per quanto riguarda l'indirizzo restituito, dipende dal sistema operativo. Tuttavia, è possibile influenzare la JVM di utilizzare IPv4 priorità passando -Djava.net.preferIPv4Stack=true agli argomenti JVM, o utilizzando:

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

Se si dispone di uno stack IPv6 e Java non è configurato per preferire IPv4, ritornerà :: 1.

Altrimenti restituirà 127.0.0.1.

+0

Non sicuro che sia corretto. Almeno in Java 7 l'impostazione predefinita è preferire lo stack IPv6 ** ** ma preferire gli indirizzi IPv4 ** ** (notare la differenza). Ciò significa che 'InetAddress.getLoopbackAddress()' restituirà un indirizzo IPv4 di default sulla maggior parte dei sistemi operativi moderni. Ci sono [due diverse proprietà] (http://docs.oracle.com/javase/7/docs/technotes/guides/net/ipv6_guide/#ipv6-networking) per controllarlo. – peterh

+0

Sono abbastanza sicuro che EJP sia completamente corretto, ha appena lasciato fuori gli "indirizzi" impliciti dopo "IPv4" nella sua risposta.Se è presente uno stack IPv6 (che è una proprietà che, se si legge il collegamento, viene * rimosso * quando si imposta lo stack preferito su IPv4), ma gli indirizzi IPv4 non sono preferiti, quindi gli indirizzi IPv6 verranno impostati come predefiniti. – codetaku

6

Credo che le altre risposte date qui siano sbagliate.

Java, per impostazione predefinita, preferisce IPv6 pila (se disponibile), ma preferisce indirizzi IPv4. Nota la sottile differenza. Questo è controllato dalle proprietà di sistema java.net.preferIPv4Stack e java.net.preferIPv6Addresses, entrambe impostate come false.

Quindi, lo InetAddress.getLoopbackAddress() restituirà quasi sempre un indirizzo IPv4. È necessario impostare le proprietà di sistema java.net.preferIPv6Addresses su true per ottenere un indirizzo IPv6.

Non vedo alcuna dipendenza del sistema operativo per il risultato di questo metodo nei sorgenti JDK. Non riesco a pensare a un sistema operativo in cui Java non avrebbe (con impostazioni predefinite) restituire un indirizzo IPv4 per questo metodo.

+0

Sei sicuro che _preferIPv6Addresses = false_ implica automaticamente che preferisce gli indirizzi IPv4? Potrebbe semplicemente significare che non ha alcuna preferenza speciale. – magnattic

+0

@atticae. Sono andato attraverso le fonti JDK e ho fatto anch'io un test. Quindi, sì, ne sono sicuro. Posso solo parlare di come 'java.net.preferIPv6Addresses' si applica al risultato del metodo' InetAddress.getLoopbackAddress() 'in quanto è solo per questo metodo che ho scavato nel codice sorgente. – peterh