2009-10-02 15 views
9

Yerel IP adresini java uygulamamdan belirlemek istiyorum. Sorun, aynı makinede, LAN ve internet bağlantılarına (avuç içi, VMWare ...) bulunan birkaç IP adresi olduğunda ortaya çıkar.java uygulamasından doğru yerel IP adresini alın

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(); 
     } 
    } 

sonucudur:

İşte benim sınavım

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

xx.xx.xx.xx doğru adres değil. Doğru 10.10.11.51'dir. jarnbjo cevaben


DÜZENLEME:

Kişisel kristal top doğruyu söylemek. Benim problemimi anladın. İstemci bir proxy üzerinden bağlanabilir, böylece ilk noktanızı kullanamıyorum. Bilgisayarımda Aşağıda bu kodu çalıştırmak durumunda: GetHostName dibinde

Internet IP = /127.0.0.1 

Ve 10.10.11.51

+0

Bunu mu demek istediniz: applet? Bir ana ile ve yerel UP adresine erişmek mümkün? –

+0

Bu sorunu da yaşadık. – KLE

+3

Tam olarak ne yapmaya çalışıyorsunuz? Neden bu bilgiye ihtiyacın var? Kullanıcı yerel bir adrese sahip değilse ne olur? Kullanıcı birçok arayüze ve birçok yerel adrese sahipse ne olur? Kullanıcı IPv6 (her arabirimin potansiyel olarak birçok adresi olabilir) varsa ne olur? Programınızda bazı tasarım problemleri var, doğru çalışması için bu özelliğe asla güvenmemeliyiz. – Juliano

cevap

-1

() C işlevi gethostbyname():

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

ben bu sonucu var. Başlangıçta/etc/hosts’e bakıyorlar, sonra da DNS’i çözmeyi denediler. Eğer/vb 10.10.11.51 myHostName eklerseniz Yani,/... GetHostName() \ WINDOWS \ System32 \ hizmetlerde ya da öylesine/etc/hosts, bir adil için analog olduğu pencerelerinde doğru bunu algılamalıdır barındıran

Bu SADECE ad çözümleme sorunudur. İlk ana bilgisayar adı almak Kodunuzda

(Hostname = InetAddress.getLocalHost() GetHostName();.) yükleme sistemi kurulduğunda bu işlevi bilgisayar adı setted dönüş. beton konak adının tüm IP (InetAddress.getAllByName (Hostname)) Sonra almak - bu dönüş tüm IP Bu ana bilgisayar

Basit bir örnek için çözülmesi

1/etc/Bu

 
127.0.0.1 localhost 
127.0.1.1 fred-desktop 
gibi ana

kodunuzu dönüş

 
HostName = fred-desktop 
HostAddressLocal = 127.0.1.1 
hostAddress = 127.0.1.1 

2 değişiklik/etc/hosts

gibi görünmek Benim ubuntu kutusunun adını -
 
127.0.0.1 localhost 
127.0.1.1 fred-desktop 
192.168.1.1 fred-desktop 
20.20.20.20 fred-desktop 

kodunuzu

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

fred-masaüstü dönecektir.

+0

Bu soru değildi. Sorun ad çözümlemesi değil, çoklu arabirimler olabileceği gerçeğidir. – sleske

+0

Çok kötü oylama bile cevap dikkat etmeyin ... –

+0

Soru Java için ve farklı bir amaç için bir C çağrı vermek – Mark

11

Daha önce de belirttiğiniz gibi, bir bilgisayarın farklı IP adreslerine sahip çok sayıda ağ arabirimi olabilir ve bunların hepsinin doğru olduğu gibi hangisinin "doğru" olduğunu düşündüğünüzü tahmin etmek biraz zor olabilir.

Kristal topağım, istemcinin yüklendiği, sunucuya bağlanmak için kullandığı IP adresini kastettiğinizi gösteriyor. sunucuda

  • , bir dinamik olarak oluşturulan HTML sayfası uygulamasını yerleştirmek ve bir uygulama parametresi olarak müşterinin IP adresini ekleyebilirsiniz: Eğer öyleyse, en az iki ihtimal var. En azından bir proxy üzerinden HTTP yapmıyorsanız, web sunucusu istemcinin IP adresini belirleyebilmeli ve uygulamayı uygulamaya geçirebilmelidir.

    Tercihleri ​​uygulamasında
  • , size uygulamasını yüklendiği web sunucusuna bir TCP soketi açıp bağlantı için kullanılıyor yerel hangi adres kontrol edebilirsiniz:

.

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

Çok teşekkürler! Sorgudaki sorularıma bakın. – EFalco

+0

Bu gün genellikle varsayılan korumalı modda güvenlik izinlerinin olmaması nedeniyle bir uygulamada çalışmayacak. Uygulamayı [java.net.NetPermission.getNetworkInformation] (http://docs.oracle.com/javase/7/docs/api/java/net/NetPermission.html) uygulamasına [ilke dosyasında vermek zorundasınız. ] (http://docs.oracle.com/javase/tutorial/security/tour1/step2.html). "Www" için bir soket oluşturmayı başlatan –

+0

, lütfen soruyu bakın: http://stackoverflow.com/questions/28487579/jsp-new-socket-www-80-stopped-working-after-years-of-working- tamam –