2009-06-30 70 views
20

此代码用于返回我的本地IP地址192.xxx.x.xxx,但现在它返回127.0.0.1。请帮助我为什么相同的代码返回不同的值。有什么我需要在Linux操作系统上观看。未在java中获得IP地址

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

回答

30

127.0.0.1是环回适配器 - 这是对(有点malfomed)问题上完全正确的回应:“什么是我的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<T>型是多么可怕直接上班!)

这里有我的笔记本电脑,结果现在:

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

(我不认为这放弃任何巨大敏感信息:)

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

+1

在上面的循环中,您也可以通过检查NetworkInterface#isLoopback()简单地跳过回送。 – omerkudat 2009-06-30 06:57:11

6

当你使用InetAddress.getLocalHost()你不能保证得到一个特定的接口,即。您可以接收回送(127)接口或连接的接口。

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

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

检查您的/ etc/host文件。如果你先放127.0.0.1,它会返回这个结果。

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

-1

这是因为你必须在/ etc线/像 127.0.0.1本地主机 主机,你需要有 192.xxx。xxx.xxx本地主机

虽然请注意,这将是非常糟糕的解决代码问题,你不应该修改Linux配置文件。这不仅是不对的(并且可能会破坏你的Linux机器上的其他一些网络感知应用程序),它也不会在其他任何地方工作(除非这些机器的管理员也很喜欢)。

javadoc for InetAddress.getLocalHost();阅读“......返回表示回送地址的InetAddress。”所以看起来在你的UNIX和WIN盒子上执行getLocalHost()是不正确的 。回环地址几乎是全部127.0.0.1

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

0

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

对于每个NetworkInterface情况下,你可以再使用getInetAddresses()方法来检索所有与网络接口相关联的InetAddress实例的Enumeration

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