How to get the ip of the computer on linux through Java?

前端 未结 5 1318
忘掉有多难
忘掉有多难 2020-12-05 15:56

How to get the ip of the computer on linux through Java ?

I searched the net for examples, I found something regarding NetworkInterface class, but I can\'t wrap my

相关标签:
5条回答
  • 2020-12-05 16:19

    Do not forget about loopback addresses, which are not visible outside. Here is a function which extracts the first non-loopback IP(IPv4 or IPv6)

    private static InetAddress getFirstNonLoopbackAddress(boolean preferIpv4, boolean preferIPv6) throws SocketException {
        Enumeration en = NetworkInterface.getNetworkInterfaces();
        while (en.hasMoreElements()) {
            NetworkInterface i = (NetworkInterface) en.nextElement();
            for (Enumeration en2 = i.getInetAddresses(); en2.hasMoreElements();) {
                InetAddress addr = (InetAddress) en2.nextElement();
                if (!addr.isLoopbackAddress()) {
                    if (addr instanceof Inet4Address) {
                        if (preferIPv6) {
                            continue;
                        }
                        return addr;
                    }
                    if (addr instanceof Inet6Address) {
                        if (preferIpv4) {
                            continue;
                        }
                        return addr;
                    }
                }
            }
        }
        return null;
    }
    
    0 讨论(0)
  • 2020-12-05 16:19

    This code worked 4me:

    import java.net.InetAddress;
    import java.net.NetworkInterface;
    import java.net.SocketException;
    import java.util.Enumeration;
    
    
    public class ShowIp {
    
        public static void main(String[] args) throws SocketException {
            NetworkInterface ni = NetworkInterface.getByName("eth0");
            Enumeration<InetAddress> inetAddresses =  ni.getInetAddresses();
    
    
            while(inetAddresses.hasMoreElements()) {
                InetAddress ia = inetAddresses.nextElement();
                if(!ia.isLinkLocalAddress()) {
                    System.out.println("IP: " + ia.getHostAddress());
                }
            }
        }
    
    }
    
    0 讨论(0)
  • 2020-12-05 16:22

    The simplest solution in my case was Socket.getLocalAddress(). I had to open the Socket specifically for that purpose, but with all the NetworkInterfaces on my Ubuntu 10.04 machine it was the only way to get the external IP address.

    0 讨论(0)
  • 2020-12-05 16:25

    It's not ok to just return the first non-loopback interface as it might have been created by some software like Parallels. It's a better bet to try fishing for the eth0.

    static private InetAddress getIPv4InetAddress() throws SocketException, UnknownHostException {
    
        String os = System.getProperty("os.name").toLowerCase();
    
        if(os.indexOf("nix") >= 0 || os.indexOf("nux") >= 0) {   
            NetworkInterface ni = NetworkInterface.getByName("eth0");
    
            Enumeration<InetAddress> ias = ni.getInetAddresses();
    
            InetAddress iaddress;
            do {
                iaddress = ias.nextElement();
            } while(!(iaddress instanceof Inet4Address));
    
            return iaddress;
        }
    
        return InetAddress.getLocalHost();  // for Windows and OS X it should work well
    }
    
    0 讨论(0)
  • 2020-12-05 16:34

    From Java Tutorial

    Why is InetAddress not a good solution? I don't see anything in the docs about cross platform compatibility?

    This code will enumerate all network interfaces and retrieve their information.

    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)
提交回复
热议问题