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,我已经彻底被打败了……希望有人赐教。
http://hi.baidu.com/myweb2/blog/item/7d6bef13460037015baf5370.html
我们前面写代码时也遇到这个问题了,后来wangcong解决的。
给你个参考:
http://www-128.ibm.com/developerworks/cn/java/l-jchat/index.html
扫了一下你上面的代码,有模仿我在服务器端用C写的获得本机IP的意思……
看看我们的XylFTP客户端是怎么写的!!放着自己的不看去找别人的!真服你们了!而且居然还这么麻烦。
你看看我们的XylTelnetConnection.GetSelfIP()才几行!