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

Java InetAddress类getLocalHost()如何返回;“首选”;IP地址?,java,networking,Java,Networking,我开始钻研通过Java获取IP地址。我知道一台机器可以通过不同的网络接口拥有不同的IP,所以我对我发现的一些示例代码有些困惑,这些代码似乎返回“首选”IP地址(根据Windows 7命令行ipconfig/all首选) 在本地计算机上运行以下代码时,将返回26个NetworkInterface对象,其中一些包含多个InetAddress对象(包括“首选”对象): 我似乎找不到将其标识为“首选”的NetworkInterface(以及其中的InetAddress)属性/方法,因此我想知道类方法In

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

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

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


谢谢。

请查看网络设置中的指标。还可以查看Windows7命令行下的“路由打印”。我认为指标越低,适配器就越“受欢迎”。

看看网络设置中的指标。还可以查看Windows7命令行下的“路由打印”。我认为指标越低,适配器就越“受欢迎”。

请查看源代码以了解更多信息

简单地说,它获取绑定到主机名的IP地址,并从返回的IP地址数组返回第一个条目


我不认为这是首选的,除了它是一个映射到机器主机名的地址(注意,一台机器也可以有多个名称)

查看源代码以了解更多信息

简单地说,它获取绑定到主机名的IP地址,并从返回的IP地址数组返回第一个条目


我没有看到任何特定于此的首选项,除了它是映射到机器主机名的地址(注意,一台机器也可以有多个名称)

我认为“首选项”可能是指路由表中最常用的条目。谁知道那些窗户狂在想什么

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

try {
        InetAddress thisIp = InetAddress.getLocalHost();  
        System.out.println("IP:" + thisIp.getHostAddress());
    } catch (Exception e) {
        e.printStackTrace();
    }
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;
}
publicstaticinetaddress getNetworkAddr(){
InetAddress localAddr=null;
//找到我们的公共IP地址
枚举网络接口;
试一试{
netInterfaces=NetworkInterface.getNetworkInterfaces();
while(netInterfaces.hasMoreElements()){
NetworkInterface ni=(NetworkInterface)netInterface.nextElement();
枚举地址=ni.getInetAddresses();
while(addresses.hasMoreElements()){
InetAddress addr=地址.nextElement();
//System.out.println(“签出”+ni.getName()+,地址为“+addr.toString()”);
如果(!addr.isSiteLocalAddress()&&
!addr.isLoopbackAddress()&&
!addr.isLinkLocalAddress()&&
addr.getHostAddress().indexOf(“:”==-1){//MAC/IPv6地址检测
System.out.println(“接口”+ni.getName()
+“似乎是Internet接口。我将使用地址”+addr.toString());
System.out.println(“关联的主机名:+addr.getHostName());
localAddr=addr;
打破
}
}   
如果(localAddr!=null)中断;
}
}捕获(无接触元素例外e){
System.out.println(“找不到公共地址”);
localAddr=null;
}捕获(SocketException e){
e、 printStackTrace();
localAddr=null;
}
返回localAddr;
}

我认为“首选”可能是指路由表中最通用的条目。谁知道那些窗户狂在想什么

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

try {
        InetAddress thisIp = InetAddress.getLocalHost();  
        System.out.println("IP:" + thisIp.getHostAddress());
    } catch (Exception e) {
        e.printStackTrace();
    }
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;
}
publicstaticinetaddress getNetworkAddr(){
InetAddress localAddr=null;
//找到我们的公共IP地址
枚举网络接口;
试一试{
netInterfaces=NetworkInterface.getNetworkInterfaces();
while(netInterfaces.hasMoreElements()){
NetworkInterface ni=(NetworkInterface)netInterface.nextElement();
枚举地址=ni.getInetAddresses();
while(addresses.hasMoreElements()){
InetAddress addr=地址.nextElement();
//System.out.println(“签出”+ni.getName()+,地址为“+addr.toString()”);
如果(!addr.isSiteLocalAddress()&&
!addr.isLoopbackAddress()&&
!addr.isLinkLocalAddress()&&
addr.getHostAddress().indexOf(“:”==-1){//MAC/IPv6地址检测
System.out.println(“接口”+ni.getName()
+“似乎是Internet接口。我将使用地址”+addr.toString());
System.out.println(“关联的主机名:+addr.getHostName());
localAddr=addr;
打破
}
}   
如果(localAddr!=null)中断;
}
}捕获(无接触元素例外e){
System.out.println(“找不到公共地址”);
localAddr=null;
}捕获(SocketException e){
e、 printStackTrace();
localAddr=null;
}
返回localAddr;
}

使用插座的其他解决方案