2009-06-30 10 views
20

Ten kod zwrócił mój lokalny adres IP jako 192.xxx.x.xxx, ale teraz powraca 127.0.0.1. Pomóż mi, dlaczego ten sam kod zwraca inną wartość. Czy jest coś, co muszę obejrzeć w systemie Linux.Adres IP nie został uzyskany w java

import java.util.*; 
import java.lang.*; 
import java.net.*; 

public class GetOwnIP 
{ 
    public static void main(String args[]) { 
    try{ 
     InetAddress ownIP=InetAddress.getLocalHost(); 
     System.out.println("IP of my system is := "+ownIP.getHostAddress()); 
    }catch (Exception e){ 
     System.out.println("Exception caught ="+e.getMessage()); 
    } 
    } 
} 

Odpowiedz

30

127.0.0.1 jest adapter sprzężenia zwrotnego - jest to całkowicie poprawne odpowiedzi na (nieco malfomed) pytanie „Jaki jest mój adres IP?”

Problem polega na tym, że istnieje wiele poprawnych poprawnych odpowiedzi na to pytanie.

EDIT: Docs dla getLocalHost powiedzieć:

Jeśli nie jest menedżerem bezpieczeństwa, jego metoda checkConnect nazywa się z lokalną nazwę hosta i -1 jako jego argumentów, aby zobaczyć czy operacja jest dozwolone. Jeśli operacja nie jest dozwolona, ​​zwracany jest adres InetAdres reprezentujący adres pętli zwrotnej.

Czy to możliwe, że zmiana w zachowaniu wynika ze zmiany uprawnień?

EDYCJA: Uważam, że NetworkInterface.getNetworkInterfaces jest tym, czego potrzebujesz, aby wyliczyć wszystkie możliwości. Oto przykład, który nie pokazuje adresy wirtualne, ale pracuje dla „main” interfejsów:

import java.net.*; 
import java.util.*; 

public class Test 
{ 
    public static void main(String[] args) 
     throws Exception // Just for simplicity 
    { 
     for (Enumeration<NetworkInterface> ifaces = 
       NetworkInterface.getNetworkInterfaces(); 
      ifaces.hasMoreElements();) 
     { 
      NetworkInterface iface = ifaces.nextElement(); 
      System.out.println(iface.getName() + ":"); 
      for (Enumeration<InetAddress> addresses = 
        iface.getInetAddresses(); 
       addresses.hasMoreElements();) 
      { 
       InetAddress address = addresses.nextElement(); 
       System.out.println(" " + address); 
      } 
     } 
    } 
} 

(Zapomniałam, jak okropny typ Enumeration<T> jest pracować bezpośrednio!)

Oto wyniki na moim laptopie właśnie teraz:

lo: 
    /127.0.0.1 
eth0: 
    /169.254.148.66 
eth1: 
eth2: 
ppp0: 
    /10.54.251.111 

(I nie sądzę, że to rozdaje żadnych ogromnie poufnych informacji :)

Jeśli wiesz, którego interfejsu sieciowego chcesz użyć, zadzwoń pod numer NetworkInterface.getByName(...), a następnie przejrzyj adresy tego interfejsu (jak pokazano w powyższym kodzie).

+1

W powyższej pętli można również po prostu pominąć pętlę zwrotną, zaznaczając pole NetworkInterface # isLoopback(). – omerkudat

+2

Dlaczego istnieje ukośnik przed adresem IP? –

+1

@ Matías To jest Java toString obiektu InetAddress użyj adresu .getHostAddress(), aby uzyskać tylko numery oddzielone kropkami. –

6

Podczas korzystania z funkcji InetAddress.getLocalHost() nie można zagwarantować określonego interfejsu, np. możesz otrzymać interfejs sprzężenia zwrotnego (127) lub podłączony.

Aby zapewnić sobie zawsze dostęp do interfejsu zewnętrznego, należy użyć klasy java.net.NetworkInterface. Statyczna klasa getByName (String) dostarczy interfejs o zdefiniowanej nazwie (np. "Eth0"). Następnie możesz użyć funkcji getInetAddresses() w celu uzyskania adresów IP (może być tylko jeden) związanych z tym interfejsem.

NetworkInterface ni = NetworkInterface.getByName("eth1"); 
ni.getInetAddresses(); 
2

Sprawdź swój plik/etc/host. Jeśli umieścisz najpierw 127.0.0.1, zwróci to jako wynik.

Prawidłowym sposobem uzyskania adresu IP jest użycie NetworkInterface.getNetworkInterfaces() i uruchomienie getInetAddresses() na każdym z nich.

-1

To dlatego, że masz linię w/etc/hosts 127.0.0.1 localhost jak trzeba mieć 192.xxx.xxx.xxx localhost

Należy zauważyć, że byłoby to bardzo złe, aby rozwiązać problem z kodem, ale nie należy modyfikować plików konfiguracyjnych Linux. Nie tylko nie jest to właściwe (i może spowodować złamanie niektórych innych aplikacji świadomych sieci na twoim komputerze linuxowym), ale także nie będzie działać nigdzie indziej (chyba że administratorzy tych skrzynek również są podobnie myślący).

javadoc dla InetAddress.getLocalHost(); przeczytaj ".... zwracany jest adres inetAdres reprezentujący adres sprzężenia zwrotnego." więc wydaje się, że implementacja getLocalHost() jest niepoprawna w twoich skrzynkach UNIX i WIN. Adres pętli zwrotnej prawie zawsze 127.0.0.1

Znaleziono ten komentarz "Host może mieć kilka adresów IP i inne hosty mogą potrzebować różnych adresów, aby do niego dotrzeć. Np. Hosty w intranecie mogą wymagać użycia 192.168.0.100 , ale zewnętrzne urządzenia mogą wymagać użycia 65.123.66.124. Jeśli masz połączenie z gniazdem do innego hosta, możesz zadzwonić pod numer Socket.getLocalAddress(), aby dowiedzieć się, który lokalny adres jest używany dla gniazda. "

0

Możesz użyć metody NetworkInterface.getNetworkInterfaces(), aby pobrać Enumeration ze wszystkich interfejsów sieciowych dla twojego systemu.

Dla każdego z NetworkInterface przypadkach można następnie użyć metody getInetAddresses() aby pobrać Enumeration z wszystkich InetAddress przypadkach związanych z interfejsem sieciowym.

Na koniec można użyć metody getHostAddress() dla każdej instancji InetAddress, aby pobrać adres IP w formie tekstowej.