【问题标题】:How to get the LAN IP of a client using Java?如何使用 Java 获取客户端的 LAN IP?
【发布时间】:2011-02-20 04:15:31
【问题描述】:

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

我尝试过这样的事情:

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

这似乎适用于某些情况,但有时它会返回环回地址或完全不同的东西。此外,它需要互联网连接。

有人有更准确的方法吗?

编辑:认为在这里提问比在评论中更好..

如果你有很多接口怎么办?例如,一个用于电缆,一个用于 wifi,一个用于虚拟盒子左右。是不是真的看不到哪一个连接到网络了?

【问题讨论】:

    标签: java ip ip-address lan


    【解决方案1】:

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

    【讨论】:

    • 如果你有很多接口怎么办?例如,一个用于电缆,一个用于 wifi,一个用于虚拟盒子左右。是不是真的看不到哪一个连接到网络?
    • @Henrik。在这种情况下,它们都是connected。由您的操作系统决定将哪一个用于外部路由。您可以使用此 Socket 构造函数java.sun.com/j2se/1.5.0/docs/api/java/net/… 来获取特定的本地地址和端口,或者构造默认套接字并将其绑定到特定接口。另外,检查您是否可以从 NetworkInterface 对象中确定所需的信息。
    • @Henrik。此外,由于 Java 必须迎合所有操作系统,您可以编写一个小的 shell 下标来确定哪个本地接口是 routing 接口,并将此信息传递给您的 Java 程序,以便它可以绑定到此特定接口。另一方面,当您连接 Socket 时,这项工作已经为您完成,因此我建议您仅在有非常具体的要求时才这样做。从您的帖子中不清楚这些要求是什么。
    【解决方案2】:

    起初:没有单一的地址。您的机器至少有两个地址(“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
    

    【讨论】:

      【解决方案3】:

      这是我用了一段时间的方法。它还包括一个小技巧来找出外部可见的 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;
      }
      

      【讨论】:

        【解决方案4】:
        try {
            InetAddress addr = InetAddress.getLocalHost();
        
            // Get IP Address
            byte[] ipAddr = addr.getAddress();
        
            // Get hostname
            String hostname = addr.getHostName();
        } catch (UnknownHostException e) {
        }
        

        【讨论】:

        • 这在许多机器上返回“127.0.0.1”,所以不是一个有效的答案。
        【解决方案5】:

        正如丹尼尔已经指出的那样,您无法知道哪个接口是“连接”的。例如,如果计算机有多个网络接口卡,它们都连接到单独的物理 LAN,该怎么办?

        让用户决定使用哪个界面或全部尝试,具体取决于您的用例。

        【讨论】:

          猜你喜欢
          • 2012-12-03
          • 2021-07-07
          • 2013-05-09
          • 2021-09-15
          • 2012-03-31
          • 2014-11-12
          • 2012-09-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多