Как получить ip компьютера на linux через Java? - PullRequest
11 голосов
/ 23 мая 2009

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

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

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

Буду очень признателен за примеры кода.

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

Ответы [ 5 ]

29 голосов
/ 23 мая 2009

Не забывайте про петлевые адреса, которые не видны снаружи. Вот функция, которая извлекает первый 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;
}
14 голосов
/ 23 мая 2009

Из Учебник по 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

5 голосов
/ 24 сентября 2011

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

}
3 голосов
/ 16 января 2012

Нельзя просто возвращать первый интерфейс без обратной связи, поскольку он мог быть создан некоторыми программами, такими как 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
}
0 голосов
/ 07 декабря 2011

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

...