2009-10-02 22 views
9

Chciałbym określić lokalny adres IP z mojego apletu java. Problem występuje, gdy istnieje kilka adresów IP na tym samym komputerze, który ma połączenia LAN i internetowe (palm, VMWare ...).Uzyskaj poprawny lokalny adres IP z apletu Java

Oto moja próba:

public static void main(String[] args) { 
     try { 
     String hostName = InetAddress.getLocalHost().getHostName(); 
     System.out.println("HostName = " + hostName); 
     System.out.println("HostAddressLocal = " + 
      InetAddress.getLocalHost().getHostAddress()); 
     InetAddress[] inetAddresses = InetAddress.getAllByName(hostName); 
     for (InetAddress inetAddress : inetAddresses) { 
      System.out.println("hostAddress = " + inetAddress.getHostAddress()); 
     } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

Wynikiem jest:

HostName = xxxx 
    HostAddressLocal = xx.xx.xx.xx 
    hostAddress = 10.10.11.51 
    hostAddress = 192.168.23.1 
    hostAddress = 192.168.106.1 

gdzie xx.xx.xx.xx nie jest prawidłowy adres. Prawidłowe jest 10.10.11.51.


EDIT w odpowiedzi na jarnbjo:

kryształ piłka powiedzieć prawdę. Rozumiesz mój problem. Klient może łączyć się przez proxy, więc nie mogę użyć twojego pierwszego punktu. Jeśli wykonam ten kod poniżej na moim komputerze:

Socket s = new Socket("www.w3c.org", 80); 
    InetAddress ip = s.getLocalAddress(); 
    System.out.println("Internet IP = " + ip.toString()); 
    s.close(); 

mam ten wynik:

Internet IP = /127.0.0.1 

I nie 10.10.11.51

+0

Masz na myśli aplet? Z głównym i w stanie uzyskać dostęp do lokalnego adresu UP? –

+0

Mieliśmy również ten problem. – KLE

+3

Co dokładnie próbujesz zrobić? Dlaczego potrzebujesz tych informacji? Co zrobić, jeśli użytkownik nie ma adresu lokalnego? Co jeśli użytkownik ma wiele interfejsów i wiele lokalnych adresów? Co się stanie, jeśli użytkownik ma IPv6 (który każdy interfejs może mieć potencjalnie wiele adresów)? W twoim programie występuje pewien problem projektowy, nigdy nie powinien polegać na tym, że ta właściwość działa poprawnie. – Juliano

Odpowiedz

-1

W dolnej części gethostname() funkcja C gethostbyname(). Początkowo spoglądają na/etc/hosts, a następnie spróbuj rozwiązać za pomocą DNS. Tak więc, jeśli dodasz 10.10.11.51 myhostname do/etc/hosts, getHostName() powinno go poprawnie wykryć W oknach jest analogowy do/etc/hosts, AFAIR w \ WINDOWS \ System32 \ Servises lub tak ...

Jest to TYLKO problem z rozpoznawaniem nazw.

W kodzie otrzymujesz najpierw nazwę hosta (hostName = InetAddress.getLocalHost(). GetHostName();) ta funkcja zwraca nazwę komputera ustawioną podczas instalacji systemu. Wtedy dostaniesz wszystko IP konkretnej nazwy hosta (InetAddress.getAllByName (nazwa hosta)) - wszystko to powrót do tego IP rozwiązany hosta

prosty przykład

1/etc/hosts, jak to

 
127.0.0.1 localhost 
127.0.1.1 fred-desktop 

Twój zysk kod

 
HostName = fred-desktop 
HostAddressLocal = 127.0.1.1 
hostAddress = 127.0.1.1 

2 zmień/etc/hosts wyglądać

 
127.0.0.1 localhost 
127.0.1.1 fred-desktop 
192.168.1.1 fred-desktop 
20.20.20.20 fred-desktop 

kod powróci

 
HostName = fred-desktop 
HostAddressLocal = 127.0.1.1 
hostAddress = 127.0.1.1 
hostAddress = 192.168.1.1 
hostAddress = 20.20.20.20 

fred-desktop - nazwa mojej skrzynki Ubuntu.

+0

To nie było pytanie. Problem nie polega na rozpoznawaniu nazw, ale na tym, że może istnieć wiele interfejsów. – sleske

+0

Bardzo złe głosowanie nawet nie zwracajcie uwagi na odpowiedź ... –

+0

Pytanie jest dla Javy i dajecie wywołanie C dla innego celu – Mark

11

Jak już odkryłeś, komputer może mieć wiele interfejsów sieciowych z różnymi adresami IP i trudno jest odgadnąć, który z nich uważasz za "poprawny", ponieważ wszystkie one są poprawne.

Moja kryształowa kulka sugeruje, że masz na myśli adres IP, z którego klient łączy się z serwerem, z którego został załadowany aplet. Jeśli tak, to masz co najmniej dwie możliwości:

  • Na serwerze można osadzić apletu na dynamicznie generowanych stronach HTML i dodać adres IP klienta jako parametr apletu. Przynajmniej jeśli nie robisz HTTP przez proxy, serwer internetowy powinien być w stanie określić adres IP klienta i przekazać go do apletu.

  • w aplecie można otworzyć gniazda TCP z serwerem WWW, z której załadowany aplet i sprawdzić, który lokalny adres jest używany do podłączenia:

.

Socket s = new Socket("www", 80); 
InetAddress ip = s.getLocalAddress(); 
s.close(); 
+0

Wielkie dzięki! Zobacz moją edycję w pytaniu. – EFalco

+0

Zazwyczaj nie będzie działać w aplecie z powodu braku uprawnień zabezpieczeń w domyślnym trybie piaskownicy. Będziesz musiał udzielić apletowi [java.net.NetPermission.getNetworkInformation] (http://docs.oracle.com/javase/7/docs/api/java/net/NetPermission.html) w pliku polityki [apletu] ] (http://docs.oracle.com/javase/tutorial/security/tour1/step2.html). –

+0

tworzenie gniazda dla "www" przestało działać, zobacz moje pytanie: http://stackoverflow.com/questions/28487579/jsp-new-socket-www-80-stopped-working-after-years-of-working- ok –

Powiązane problemy