Java 如何在双栈操作系统上获取IPv4和IPv6

Java 如何在双栈操作系统上获取IPv4和IPv6,java,network-programming,Java,Network Programming,我有一台双层机器 我的问题是我只能使用IPv4 InetAddress address = InetAddress.getLocalHost(); 如果我使用网络接口API,那么我会得到所有的IP地址,其中包括我的MAC地址以及IP地址。 现在有什么方法可以同时获得我机器的IPv4和IPv6。在Linux中, InetAddress.getLocalHost()将查找主机名,然后返回DNS分配给该主机名的第一个IP地址。如果您在/etc/hosts文件中有该主机名,它将获得该主机名在该文件中

我有一台双层机器

我的问题是我只能使用IPv4

InetAddress address = InetAddress.getLocalHost();
如果我使用网络接口API,那么我会得到所有的IP地址,其中包括我的MAC地址以及IP地址。

现在有什么方法可以同时获得我机器的IPv4和IPv6。

在Linux中, InetAddress.getLocalHost()将查找主机名,然后返回DNS分配给该主机名的第一个IP地址。如果您在/etc/hosts文件中有该主机名,它将获得该主机名在该文件中的第一个IP地址

如果您注意,这个方法只返回一个InetAddress

如果尚未分配主机名,则很可能是localhost.localdomain。您可以使用命令行设置主机名:

hostname [name]
或者在/etc/sysconfig/network文件中设置它

如果要获取分配给主机名的所有ip地址(包括IPv6),可以使用:

InetAddress.getAllByName(InetAddress.getLocalHost().getHostName());
如果要获取分配给主机网络接口的所有ip地址(包括IPv6),则必须使用NetworkInterface类

这里我粘贴了一些示例代码:

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.net.SocketException;
import java.net.NetworkInterface;
import java.util.*;

public class Test
{
    public static void main(String[] args)
    {
        try
        {
            System.out.println("getLocalHost: " + InetAddress.getLocalHost().toString());

            System.out.println("All addresses for local host:");
            InetAddress[] addr = InetAddress.getAllByName(InetAddress.getLocalHost().getHostName());
            for(InetAddress a : addr)
            {
              System.out.println(a.toString());
            }
        }
        catch(UnknownHostException _e)
        {
            _e.printStackTrace();
        }

        try
        {
            Enumeration nicEnum = NetworkInterface.getNetworkInterfaces();
            while(nicEnum.hasMoreElements())
            {
                NetworkInterface ni=(NetworkInterface) nicEnum.nextElement();
                System.out.println("Name: " + ni.getDisplayName());
                System.out.println("Name: " + ni.getName());
                Enumeration addrEnum = ni.getInetAddresses();
                while(addrEnum.hasMoreElements()) 
                {
                    InetAddress ia= (InetAddress) addrEnum.nextElement();
                    System.out.println(ia.getHostAddress());
                }
            }
        }
        catch(SocketException _e)
        {
            _e.printStackTrace();
        }
    }
}
对于本例,我从中的一个响应中获得了代码