【问题标题】:IP Address not obtained in java在java中没有获得IP地址
【发布时间】:2009-06-30 06:33:06
【问题描述】:

此代码用于将我的本地 IP 地址返回为 192.xxx.x.xxx 但现在它返回 127.0.0.1 。请帮助我为什么相同的代码返回不同的值。在 linux OS 上我有什么需要看的吗?

import java.util.*;
import java.lang.*;
import java.net.*;

public class GetOwnIP
{
  public static void main(String args[]) {
    try{
      InetAddress ownIP=InetAddress.getLocalHost();
      System.out.println("IP of my system is := "+ownIP.getHostAddress());
    }catch (Exception e){
      System.out.println("Exception caught ="+e.getMessage());
    }
  }
}

【问题讨论】:

    标签: java


    【解决方案1】:

    127.0.0.1 是环回适配器 - 这是对“我的 IP 地址是什么?”(有点畸形)问题的完全正确的回答

    问题在于该问题有多个正确答案。

    编辑:getLocalHost 的文档说:

    如果有安全管理器,它的 checkConnect 方法被调用 本地主机名和 -1 作为其 参数以查看操作是否 允许。如果操作不 允许,一个 InetAddress 表示 返回环回地址。

    行为的改变是否可能是由于权限的改变?

    编辑:我相信NetworkInterface.getNetworkInterfaces 是您列举所有可能性所需的。这是一个不显示虚拟地址但适用于“主”接口的示例:

    import java.net.*;
    import java.util.*;
    
    public class Test
    {
        public static void main(String[] args)
            throws Exception // Just for simplicity
        {
            for (Enumeration<NetworkInterface> ifaces = 
                   NetworkInterface.getNetworkInterfaces();
                 ifaces.hasMoreElements(); )
            {
                NetworkInterface iface = ifaces.nextElement();
                System.out.println(iface.getName() + ":");
                for (Enumeration<InetAddress> addresses =
                       iface.getInetAddresses();
                     addresses.hasMoreElements(); )
                {
                    InetAddress address = addresses.nextElement();
                    System.out.println("  " + address);
                }
            }
        }
    }
    

    (我忘记了直接使用 Enumeration&lt;T&gt; 类型有多糟糕!)

    这是我笔记本电脑上的结果:

    lo:
      /127.0.0.1
    eth0:
      /169.254.148.66
    eth1:
    eth2:
    ppp0:
      /10.54.251.111
    

    (我认为这不会泄露任何大量敏感信息:)

    如果您知道要使用哪个网络接口,请致电NetworkInterface.getByName(...),然后查看该接口的地址(如上面的代码所示)。

    【讨论】:

    • 在上面的循环中,您也可以通过检查 NetworkInterface#isLoopback() 来跳过环回。
    • 为什么IP地址前有斜线?
    • @Matías 它是 InetAddress 对象的 Java toString 使用 address.getHostAddress() 来获取点分隔的数字。
    【解决方案2】:

    当您使用 InetAddress.getLocalHost() 时,您不能保证获得特定的接口,即。您可以接收环回 (127) 接口或已连接的接口。

    为了确保您始终获得外部接口,您应该使用 java.net.NetworkInterface 类。静态 getByName(String) 类将为您提供具有已定义名称(例如“eth0”)的接口。然后您可以使用 getInetAddresses() 函数获取绑定到该接口的 IP 地址(可能只有一个)。

    NetworkInterface ni = NetworkInterface.getByName("eth1");
    ni.getInetAddresses();
    

    【讨论】:

      【解决方案3】:

      检查您的 /etc/host 文件。如果你把 127.0.0.1 放在前面,它会返回 this 作为结果。

      获取ip地址的正确方法是使用NetworkInterface.getNetworkInterfaces()并在每个上面运行getInetAddresses()

      【讨论】:

        【解决方案4】:

        您可以使用NetworkInterface.getNetworkInterfaces() 方法检索系统所有网络接口的Enumeration

        对于每个NetworkInterface 实例,您可以使用getInetAddresses() 方法检索与网络接口关联的所有InetAddress 实例中的Enumeration

        最后,您可以在每个InetAddress 实例上使用getHostAddress() 方法来检索文本形式的IP 地址。

        【讨论】:

          【解决方案5】:

          这是因为您在 /etc/hosts 中有一行 127.0.0.1 本地主机 你需要有 192.xxx.xxx.xxx 本地主机

          虽然请注意这将非常糟糕,因为要解决代码问题,您不应该修改 linux 配置文件。它不仅不正确(并且有可能破坏您的 linux 机器上的其他一些网络感知应用程序),它也无法在其他任何地方工作(除非这些机器的管理员也志同道合)。

          InetAddress.getLocalHost() 的 javadoc;阅读“....返回代表环回地址的 InetAddress。”所以看起来 getLocalHost() 的实现是不正确的 在您的 UNIX 和 WIN 框中。环回地址几乎都是 127.0.0.1

          找到这条评论 “一个主机可能有多个 IP 地址,而其他主机可能必须使用不同的地址才能访问它。例如,内联网上的主机可能必须使用 192.168.0.100,但外部机器可能必须使用 65.123.66.124。如果你有一个套接字连接到您可以调用的另一台主机 Socket.getLocalAddress() 找出用于套接字的本地地址。”

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-08-08
            • 2015-03-07
            • 1970-01-01
            • 2011-02-25
            • 2021-04-12
            • 1970-01-01
            • 2023-03-15
            • 2022-01-21
            相关资源
            最近更新 更多