Java获得本机IP的问题

Java网络课程设计中……,前几天windflush同学和我讨论了关于Java不能用如下语句:

1
InetAddress.getLocalHost()

来获得本机IP的问题。这个方法总是得到127.0.1.1。让人郁闷不已。最后他不知道在什么地方找到了一大段代码来解决这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public static String getIps(){
    ArrayList ips = new ArrayList();

    try{
        Enumeration<networkinterface> interfaces = NetworkInterface.getNetworkInterfaces();

        while (interfaces.hasMoreElements()) {
            NetworkInterface interfaceN = (NetworkInterface)interfaces.nextElement();
            Enumeration<inetaddress> ienum = interfaceN.getInetAddresses();
            while (ienum.hasMoreElements()) {
                InetAddress ia = ienum.nextElement();
                String adress = ia.getHostAddress().toString();

                if( adress.length() < 16) {
                    if(adress.startsWith("127")){
                        System.out.println(ia.getHostAddress());
                    }
                    else if(adress.indexOf(":") > 0){
                        System.out.println(ia.getHostAddress());
                    }
                }
                ips.add(adress);
            }
        }
    }
    catch(Exception e){
        System.out.println("pas de carte reseau");
        e.printStackTrace();
    }

    return (String) ips.get(1);
}

但是,我一直不明白这是怎么回事情,今天偶尔,在学校机房下的Windows写了一个小测试程序,测试本机IP,才发现这个方法工作得很好!百思不得其解,我和windflush都是在Linux下写的程序,难道是这个原因是Linux?到自己机器上在Linux又测试一遍,又是~

很郁闷,想到了/etc/hosts文件,一看,晕倒~hosts文件的最后一行就写着我的主机名对应127.0.1.1而127.0.0.1对应的是localhost!这下也明白为什么结果是奇怪的127.0.1.1而不是.0.1了。看来Linux下Java偷了个懒,是从hosts文件中获得结果的。 而Windows下同样的程序,我直接用Linux下编译的.class文件得到的结果就是正确的,Windows的hosts文件中没有127.0.1.1那行,我加上也不影响。看来是平台的关系了~相同的程序,在不同平台下,还是有不同的结果。

又猜想,若从hosts文件中删掉那个奇怪的127.0.1.1会有什么结果。结果很失望,Java只在hosts文件中查找,它返回了UnknownHostException。其实,我感觉hosts文件还是有问题的,如果手工把它改成我的IP应该就没有问题的,但是如果多网卡的机器呢?想不通,Java怎么就不能换个处理方式呢?

更为郁闷的是,那段在别人的Linux机器上也可以正确得到自己的IP地址的程序,对我的机器是无效的,在我的机器上得到的是127.0.0.1,我已经彻底被打败了……希望有人赐教。

《Java获得本机IP的问题》有5条评论

  1. 看看我们的XylFTP客户端是怎么写的!!放着自己的不看去找别人的!真服你们了!而且居然还这么麻烦。
    你看看我们的XylTelnetConnection.GetSelfIP()才几行!

    回复

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据