在java中未获得IP地址

在java中未获得IP地址,java,Java,这段代码过去返回我的本地ip地址为192.xxx.x.xxx,但现在返回127.0.0.1。请帮助我为什么相同的代码返回不同的值。在linux操作系统上有什么我需要看的吗 import java.util.*; import java.lang.*; import java.net.*; public class GetOwnIP { public static void main(String args[]) { try{ InetAddress ownIP=Inet

这段代码过去返回我的本地ip地址为192.xxx.x.xxx,但现在返回127.0.0.1。请帮助我为什么相同的代码返回不同的值。在linux操作系统上有什么我需要看的吗

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());
    }
  }
}

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

问题是这个问题有多个正确答案

编辑:
getLocalHost
的文档说:

如果有安全经理,其 使用调用checkConnect方法 本地主机名和-1作为其 参数,以查看操作是否正确 允许。如果操作不正确 允许,表示 返回环回地址

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

编辑:我相信
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);
            }
        }
    }
}
(我不认为这会泄露任何非常敏感的信息:)


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

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

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

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

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


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

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

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

InetAddress.getLocalHost()的javadoc;读取“…返回一个表示环回地址的InetAddress”。因此,getLocalHost()的实现似乎不正确 在UNIX和WIN Box上。环回地址几乎总是127.0.0.1

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

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

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

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

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

在上面的循环中,您也可以通过检查NetworkInterface#isLoopback()跳过环回。为什么IP地址前有一个斜杠?@Matí因为它是InetAddress对象的Java toString使用address.getHostAddress()只获取点分隔的数字。