2010-05-16 100 views
7

如何获得使用Java的计算机的局域网IP地址?我需要连接到路由器和网络其余部分的IP地址。如何获取使用Java的客户端的LAN IP?

我已经试过这样的事情:

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

这似乎在某些情况下工作,但有时它返回回送地址或完全不同的东西。此外,它需要互联网连接。

有没有人有更准确的方法做到这一点?

编辑:认为这将是更好的要求比在这里评论..

,如果你有什么很多的接口?例如,一个用于电缆,一个用于wifi,一个用于虚拟盒子等。是不可能真正看到哪一个连接到网络?

回答

15

尝试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 for'if(cur.isLoopback())' – aioobe 2010-05-16 20:20:21

+0

如果你有很多接口呢?例如,一个用于电缆,一个用于wifi,一个用于虚拟盒子等等。是不可能实际看到哪一个连接到网络? – cragiz 2010-05-16 21:05:23

+0

@亨利克。在这种情况下,所有这些都是“连接”的。由您的操作系统决定哪一个将用于外部路由。你可以使用这个Socket构造函数http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#Socket(java.net.InetAddress,%20int,%20java.net。 InetAddress,%20int)来选择特定的本地地址和端口,或者构建默认套接字并将其绑定到特定接口。另外,请检查您是否可以从NetworkInterface对象确定需要的信息。 – 2010-05-17 11:56:03

7

起初:没有一个地址。您的机器至少有两个地址(“lo”上为127.0.0.1,“eth1”上为192.168.1.1)。

你想这样的:Listing network interfaces

正如你所期待,你不能自动检测出连接到任何你的路由器的,因为这需要你的路由表的潜在复杂的分析。但如果你只是想要任何非本地地址,这应该足够了。可以肯定的是,至少在Vista或Windows 7上至少使用一次,因为它们会添加IPv6地址。

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

以下是从例如程序输出样本:

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

这是我用于方法而。它还包括一些小技巧来找出外部可见的IP地址。

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已经指出的那样,您无法知道哪个接口是“连接”的接口。例如,如果计算机有多个网络接口卡都连接到单独的物理局域网?

让用户决定使用哪个接口或全部尝试它们,具体取决于您的用例。