How to get the LAN IP of a client using Java?

前端 未结 5 980
攒了一身酷
攒了一身酷 2021-02-06 09:22

How can i get the LAN IP-address of a computer using Java? I want the IP-address which is connected to the router and the rest of the network.

I\'ve tried something like

相关标签:
5条回答
  • 2021-02-06 09:23

    As Daniel already pointed out, you cannot know which interface is the one "connected". What if, for example, the computer has multiple network interface cards which are both connected to separate physical LANs?

    Let the user decide which interface to use or try them all, depending on what your use case is.

    0 讨论(0)
  • 2021-02-06 09:26

    At first: There is no single address. Your machine has at least two adresses (127.0.0.1 on "lo" and maybe 192.168.1.1 on "eth1").

    You want this: Listing network interfaces

    As you may expect, you cannot automatically detect which one is connected to any of your routers, since this needs potentially complex parsing of your routing tables. But if you just want any non-local address this should be enought. To be sure, try to use this at least one time on vista or Windows 7, since they add IPv6 addresses.

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

    The following is sample output from the example program:

    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 讨论(0)
  • 2021-02-06 09:36

    Try 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( )
            );
        }
    }
    
    0 讨论(0)
  • 2021-02-06 09:42

    This is a method I've used for a while. It includes a little hack to figure out the externally visible ip-address as well.

    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 讨论(0)
  • 2021-02-06 09:44
    try {
        InetAddress addr = InetAddress.getLocalHost();
    
        // Get IP Address
        byte[] ipAddr = addr.getAddress();
    
        // Get hostname
        String hostname = addr.getHostName();
    } catch (UnknownHostException e) {
    }
    
    0 讨论(0)
提交回复
热议问题