如何通过Java获取linux上电脑的ip?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/901755/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 20:51:19  来源:igfitidea点击:

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

javalinuxnetworkingip-address

提问by

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

如何通过Java获取linux上电脑的ip?

I searched the net for examples, I found something regarding NetworkInterface class, but I can't wrap my head around how I get the Ip address.

我在网上搜索了一些例子,我发现了一些关于 NetworkInterface 类的东西,但我无法理解我是如何获得 Ip 地址的。

What happens if I have multiple network interfaces running in the same time ? Which Ip address will be returned.

如果同时运行多个网络接口会怎样?将返回哪个 IP 地址。

I would really appreciate some code samples.

我真的很感激一些代码示例。

P.S: I've used until now the InetAddress class which is a bad solution for cross-platform applications. (win/Linux).

PS:到目前为止,我一直使用 InetAddress 类,这对于跨平台应用程序来说是一个糟糕的解决方案。(赢/Linux)。

回答by grepsedawk

From Java Tutorial

来自Java 教程

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

为什么InetAddress不是一个好的解决方案?我在文档中没有看到有关跨平台兼容性的任何内容?

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

回答by adrian.tarau

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)

不要忘记环回地址,它们在外面是不可见的。这是一个提取第一个非环回 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;
}

回答by Bruno

This code worked 4me:

此代码工作 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());
            }
        }
    }

}

回答by FelixM

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.

就我而言,最简单的解决方案是Socket.getLocalAddress(). 我必须专门为此目的打开 Socket,但对于我的 Ubuntu 10.04 机器上的所有 NetworkInterfaces,这是获取外部 IP 地址的唯一方法。

回答by Maciej Trybi?o

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.

仅仅返回第一个非环回接口是不行的,因为它可能是由一些软件(如 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
}