Как получить IP-адрес компьютера на Linux через Java?

Как получить ip компьютера на Linux через Java?

Я искал сеть для примеров, я нашел что-то в отношении класса NetworkInterface, но я не могу оборачивать голову тем, как я получаю IP-адрес.

Что произойдет, если у меня будет несколько сетевых интерфейсов, работающих в одно и то же время? Какой IP-адрес будет возвращен.

Я бы очень оценил некоторые примеры кода.

P.S: Я использовал до сих пор класс InetAddress, который является плохим решением для кросс-платформенных приложений. (Выигрыш/Linux).

Ответ 1

Не забывайте о петлевых адресах, которые не видны снаружи. Вот функция, которая извлекает первый IP-адрес без IP-соединения (IPv4 или 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;
}

Ответ 2

Из Учебник по Java

Почему InetAddress не является хорошим решением? Я не вижу ничего в документах о совместимости с кросс-платформой?

Этот код будет перечислять все сетевые интерфейсы и извлекать их информацию.

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

Этот код работал 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());
            }
        }
    }

}

Ответ 4

Неверно просто вернуть первый интерфейс без петли, поскольку он мог быть создан некоторым программным обеспечением, таким как Parallels. Это лучше сделать попытку ловить рыбу для 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
}

Ответ 5

Простейшим решением в моем случае было Socket.getLocalAddress(). Я должен был открыть Socket специально для этой цели, но со всеми сетевыми интерфейсами на моей машине Ubuntu 10.04 это был единственный способ получить внешний IP-адрес.