首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >InetAddress类getLocalHost()如何返回“首选”IP地址?

InetAddress类getLocalHost()如何返回“首选”IP地址?
EN

Stack Overflow用户
提问于 2013-02-12 01:28:40
回答 4查看 4.3K关注 0票数 0

我开始深入研究如何通过Java获取IP地址。我知道一台机器可以通过不同的网络接口拥有不同的IP,所以我对我发现的一些似乎返回“首选”IP地址的示例代码感到有点困惑(根据Windows7命令行ipconfig /all,首选)。

当我在本地计算机上运行以下代码时,返回了26个NetworkInterface对象,其中一些具有多个InetAddress对象(包括“首选”对象):

代码语言:javascript
运行
复制
Enumeration<NetworkInterface> eNI = null;
    NetworkInterface ni = null;

    Enumeration<InetAddress> eIA = null;
    InetAddress ia = null;

    try {
        eNI = NetworkInterface.getNetworkInterfaces();
    } catch (Exception e) {
    }

    while (eNI.hasMoreElements()) {

        ni = eNI.nextElement();
        System.out.println("NtwkIntfc name: " + ni.getName());
        System.out.println("NtwkIntfc disp name: " + ni.getDisplayName());

        try {
            System.out.println("NtwkIntfc hardware addr: " + Hex.encodeHexString(ni.getHardwareAddress()));
        } catch (Exception e) {
        }

        eIA = ni.getInetAddresses();

        while (eIA.hasMoreElements()) {

            ia = eIA.nextElement();

            System.out.println("InetAddress host address: " + ia.getHostAddress());
            System.out.println("InetAddress host name: " + ia.getHostName());

        }
    }

然而,这段简单得多的代码只是返回“首选”IPv4地址:

代码语言:javascript
运行
复制
try {
        InetAddress thisIp = InetAddress.getLocalHost();  
        System.out.println("IP:" + thisIp.getHostAddress());
    } catch (Exception e) {
        e.printStackTrace();
    }

我似乎找不到将其标识为“首选”的NetworkInterface (以及其中的InetAddress )属性/方法,所以我想知道类方法InetAddress.getLocalHost()是如何做到的?此外,这个首选IP是标准的网络概念还是某种类型的Windows特定概念?

谢谢。

EN

Stack Overflow用户

发布于 2013-02-12 01:34:20

我认为“首选”可能在某种程度上是指路由表中最通用的条目。谁知道那些Windows的发烧友在想什么呢。

然而,该地址也可以对应于最有可能是由DHCP分配的公共IP/的地址。如果您正在寻找获取最有可能是公共地址/用于打开端口的代码,下面是我用来获取IPv4地址的代码:

代码语言:javascript
运行
复制
public static InetAddress getNetworkAddr() {
    InetAddress localAddr = null;

    // Find our public IP address
    Enumeration<NetworkInterface> netInterfaces;
    try {
        netInterfaces = NetworkInterface.getNetworkInterfaces();
        while (netInterfaces.hasMoreElements()) {               
            NetworkInterface ni = (NetworkInterface) netInterfaces.nextElement();               
            Enumeration<InetAddress> addresses = ni.getInetAddresses();             
            while( addresses.hasMoreElements() ) {
                InetAddress addr = addresses.nextElement();

                // System.out.println("Checking out " + ni.getName() + " with address " + addr.toString());

                if (!addr.isSiteLocalAddress() && 
                        !addr.isLoopbackAddress() && 
                        !addr.isLinkLocalAddress() &&
                        addr.getHostAddress().indexOf(":") == -1) { // MAC/IPv6 address detection
                    System.out.println("Interface " + ni.getName()
                            + " seems to be InternetInterface. I'll take address " + addr.toString());
                    System.out.println("Associated hostname: " + addr.getHostName());
                    localAddr = addr;
                    break;
                }
            }   
            if( localAddr != null ) break;
        }
    } catch( NoSuchElementException e) {
        System.out.println("Couldn't find a public address");
        localAddr = null;
    } catch (SocketException e) {
        e.printStackTrace();
        localAddr = null;
    }

    return localAddr;
}
票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14817483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档