IP地址未在java中获取

时间:2009-06-30 06:33:07

标签: java

此代码用于将本地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());
    }
  }
}

5 个答案:

答案 0 :(得分:30)

127.0.0.1是环回适配器 - 它是对(有点故障)问题“我的IP地址是什么?”的完全正确的回应。

问题是该问题有多个正确答案。

编辑:getLocalHost的文档说:

  

如果有安全经理,那么   使用check调用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<T>类型有多糟糕!)

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

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

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

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

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:2)

检查/ etc / host文件。如果先放入127.0.0.1,它将返回结果。

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:-1)

这是因为你在/ etc / hosts中有一行代码 127.0.0.1 localhost 你需要拥有 192.xxx.xxx.xxx localhost

虽然请注意,这对于解决代码问题非常糟糕,但您不应该修改linux配置文件。它不仅不正确(并且有可能破坏你的Linux机箱上的其他一些网络感知应用程序),它也无法在其他任何地方运行(除非那些机箱的管理员也很喜欢)。

InetAddress.getLocalHost()的javadoc;读取“....返回表示环回地址的InetAddress。”所以似乎getLocalHost()的实现是不正确的 在UNIX和WIN框中。环回地址几乎总是127.0.0.1

发现此评论 “主机可能有多个IP地址,其他主机可能必须使用不同的地址才能到达。例如,内网上的主机可能必须使用192.168.0.100,但外部机器可能必须使用65.123.66.124。如果你有一个套接字连接到您可以呼叫的另一台主机 Socket.getLocalAddress()以找出用于套接字的本地地址。“