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

Posted

技术标签:

【中文标题】如何通过Java获取linux上电脑的ip?【英文标题】:How to get the ip of the computer on linux through Java? 【发布时间】:2010-10-28 10:55:58 【问题描述】:

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

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

非常感谢一些代码示例。

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

【问题讨论】:

使用 InetAddress 会发生什么? 这是我编辑到问题中参考的问题的完全相同的副本。那里有很多答案。 InetAddress 非常适合跨平台。我从来没有遇到过任何问题。 如果你有多个网卡并且你要求你所在计算机的“一个”IP地址,你得到的IP地址取决于计算机上网络接口的绑定顺序,这取决于很多变数。我不会依赖它是可预测的。 【参考方案1】:

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

为什么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

【讨论】:

回答“为什么 InetAddress 不是一个好的解决方案?”的问题:在 /etc/hosts 中主机名列为 127.0.0.1 的 linux 系统上,结果不是很有用。在主机名未出现在 /etc/hosts 或 dns 中的系统上,您会收到 UnknownHostException。在 os x 上,主机名似乎通常可以很好地解析。我不知道 Windows 上的情况如何,但我想它运行良好。 以上代码不起作用,请在此处复制和粘贴表单:gist.github.com/1225358【参考方案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

【讨论】:

我试过你的代码没有返回我的实际 ip,我安装了虚拟主机,它返回给我一个虚拟主机 ip...我还尝试了@adrian.tarau 解决方案,这就像一个魅力。它实际上返回了我的本地机器 IP。【参考方案5】:

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

【讨论】:

以上是关于如何通过Java获取linux上电脑的ip?的主要内容,如果未能解决你的问题,请参考以下文章

Linux下如何获取网卡信息

Linux 项目 shell 自动获取报告本机IP | 通过shell 自动获取报告本机IP

两台电脑用一根网线相连,怎么用java语言获取另一台电脑的IP地址和端口?

JAVA获取公网ip

如何让别人通过ip地址访问我的电脑

如何使用 express 框架通过 node.js 获取远程客户端的本地 IP 地址?