2010-05-16 16 views
7

Java kullanan bir bilgisayarın LAN IP adresini nasıl alabilirim? Yönlendiriciye ve ağın geri kalanına bağlı IP adresini istiyorum.Java kullanan bir istemcinin LAN IP'sini nasıl alabilirim?

Socket s = new Socket("www.google.com", 80); 
String ip = s.getLocalAddress().getHostAddress(); 
s.close(); 

Bu bazı durumlarda çalışmıyor gibi görünüyor, ama bazen geri döngü-adresini veya tamamen farklı bir şey verir:

Böyle bir şey denedim. Ayrıca internet bağlantısı gerektirir.

Bunu yapan daha doğru bir yöntem var mı?

DÜZENLEME: bir yorumda daha burada sormak daha iyi olacağını düşündüm .. birçok arayüzleri var ne

? Örneğin, biri kablolu, biri wifi, diğeri sanal kutu vb. Hangisinin ağa bağlı olduğunu görmek imkansız mı?

cevap

15

deneyin java.net.NetworkInterface

import java.net.NetworkInterface; 

... 

for (
    final Enumeration<NetworkInterface> interfaces = 
     NetworkInterface.getNetworkInterfaces(); 
    interfaces.hasMoreElements(); 
) 
{ 
    final NetworkInterface cur = interfaces.nextElement(); 

    if (cur.isLoopback()) 
    { 
     continue; 
    } 

    System.out.println("interface " + cur.getName()); 

    for (final InterfaceAddress addr : cur.getInterfaceAddresses()) 
    { 
     final InetAddress inet_addr = addr.getAddress(); 

     if (!(inet_addr instanceof Inet4Address)) 
     { 
      continue; 
     } 

     System.out.println(
      " address: " + inet_addr.getHostAddress() + 
      "/" + addr.getNetworkPrefixLength() 
     ); 

     System.out.println(
      " broadcast address: " + 
       addr.getBroadcast().getHostAddress() 
     ); 
    } 
} 
+3

+1, 'if (cur.isLoopback())' – aioobe

+0

Birçok arabiriminiz varsa ne olur? Örneğin, biri kablo için, biri wifi için ve diğeri sanal kutu için. ağa hangisinin bağlı olduğunu acctually görmek imkansız mıdır? – cragiz

+0

@Henrik. Bu durumda hepsi "bağlandı". Dış yönlendirme için hangisinin kullanılacağını belirlemek OS'nize kalmıştır. Bu Soket yapıcıyı http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#Socket(java.net.InetAddress%%%%%;%20int%%20java.net adresinde kullanabilirsiniz. Belirli yerel adresi ve bağlantı noktasını almak veya varsayılan soketi oluşturmak ve belirli bir arabirime bağlamak için InetAddress,% 20int). Ayrıca, NetworkInterface nesnesinden gereksinim duyduğunuz bilgileri de belirleyebileceğinizi kontrol edin. –

7

Başında: Tek adres yok. Makinenizde en az iki adres vardır ("lo" üzerinde 127.0.0.1 ve "eth1" üzerinde 192.168.1.1).

Bunu istiyorsun: Bu yönlendirme tablolarının potansiyel karmaşık ayrıştırma ihtiyacı beri, otomatik, senin yönlendiriciler herhangi birine bağlı olan bir tespit edemez tahmin gibi Listing network interfaces

. Ancak sadece yerel olmayan herhangi bir adres istiyorsanız, bu konuya değinilmelidir. Emin olmak için, IPv6 adresleri eklediklerinden, en az bir kez Vista veya Windows 7'de kullanmayı deneyin. Bu bir için kullandım bir yöntemdir

Display name: bge0 
Name: bge0 
InetAddress: /fe80:0:0:0:203:baff:fef2:e99d%2 
InetAddress: /121.153.225.59 

Display name: lo0 
Name: lo0 
InetAddress: /0:0:0:0:0:0:0:1%1 
InetAddress: /127.0.0.1 
0
try { 
    InetAddress addr = InetAddress.getLocalHost(); 

    // Get IP Address 
    byte[] ipAddr = addr.getAddress(); 

    // Get hostname 
    String hostname = addr.getHostName(); 
} catch (UnknownHostException e) { 
} 
1

: Aşağıdaki

import java.io.*; 
import java.net.*; 
import java.util.*; 
import static java.lang.System.out; 

public class ListNets 
{ 
    public static void main(String args[]) throws SocketException { 
     Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); 
     for (NetworkInterface netint : Collections.list(nets)) 
      displayInterfaceInformation(netint); 
    } 

    static void displayInterfaceInformation(NetworkInterface netint) throws SocketException { 
     out.printf("Display name: %s\n", netint.getDisplayName()); 
     out.printf("Name: %s\n", netint.getName()); 
     Enumeration<InetAddress> inetAddresses = netint.getInetAddresses(); 
     for (InetAddress inetAddress : Collections.list(inetAddresses)) { 
      out.printf("InetAddress: %s\n", inetAddress); 
     } 
     out.printf("\n"); 
    } 
} 

Örnek programından örnek çıktı süre. Dışarıdan görülebilen ip adresini de anlamaya yarayan küçük bir hack içerir.

private List<String> getLocalHostAddresses() { 

    List<String> addresses = new ArrayList<String>(); 

    try { 
     Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); 

     while (e.hasMoreElements()) { 
      NetworkInterface ni = e.nextElement(); 
      Enumeration<InetAddress> e2 = ni.getInetAddresses(); 
      while (e2.hasMoreElements()) 
       addresses.add(e2.nextElement().getHostAddress()); 
     } 
     URL u = new URL("http://whatismyip.org"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(
       u.openStream())); 
     addresses.add(in.readLine()); 
     in.close(); 
    } catch (Exception ignore) { 
    } 

    return addresses; 
} 
0

Daniel zaten işaret ettiği gibi, hangi arabirimin "bağlı" olduğunu bilmiyorsunuz. Örneğin, bilgisayarın her ikisi de ayrı fiziksel LAN'lara bağlı birden fazla ağ arabirim kartına sahipse ne olur?

Kullanıcı, kullanım durumunuza göre, hangi arabirimin kullanılacağını veya hepsini denemeye karar vermesine izin verin.

İlgili konular