InetAddress.getLocalHost().getHostAddress() 获取的ip为127.0.0.1
InetAddress.getLocalHost().getHostAddress()是通过本机名去获取本机ip的
而Java 的InetAddress.java 调用 InetAddressImpl.java 的
public native String getLocalHostName() throws UnknownHostException; 来获取本地主机名,是一个系统原生方法
和ping hostname 返回的 IP 地址是同一个,并不是 ipconfig 方法得到的 eth0 IP 地址.
默认情况下本机名是localhost,在host文件中对应的ip是127.0.0.1,所以通过这个函数获取到的ip就是127.0.0.1了
解决方法:
1.本机名设置:
vi /etc/sysconfig/network
修改HOSTNAME为想要设定的hostname
比如这里设置为zookeeper_test
2.修改hosts文件
vi /etc/hosts
可以看到默认的localhost是对应127.0.0.1的,这里新增本地ip,并对应到新的本机名,如这个zookeeper_test的设置
然后reboot重启,就可以正常获取ip了
所以这个方法并不是一个系统无关的可靠方法,同时多网卡环境下也容易遇到问题,比较好的方案应该是遍历所有网卡拿到ip列表,然后再选择其一
1 import java.util.Set; 2 import java.util.HashSet; 3 import java.util.ArrayList; 4 import org.slf4j.Logger; 5 import org.slf4j.LoggerFactory; 6 import java.net.InetAddress; 7 import java.util.Collections; 8 import java.net.NetworkInterface; 9 import java.util.Enumeration; 10 11 12 public class NetUtil 13 { 14 private static Logger logger = LoggerFactory.getLogger(NetUtil.class); 15 public static ArrayList<String> getLocalIpAddr() 16 { 17 ArrayList<String> ipList = new ArrayList<String>(); 18 InetAddress[] addrList; 19 try 20 { 21 Enumeration interfaces=NetworkInterface.getNetworkInterfaces(); 22 while(interfaces.hasMoreElements()) 23 { 24 NetworkInterface ni=(NetworkInterface)interfaces.nextElement(); 25 Enumeration ipAddrEnum = ni.getInetAddresses(); 26 while(ipAddrEnum.hasMoreElements()) 27 { 28 InetAddress addr = (InetAddress)ipAddrEnum.nextElement(); 29 if (addr.isLoopbackAddress() == true) 30 { 31 continue; 32 } 33 34 String ip = addr.getHostAddress(); 35 if (ip.indexOf(":") != -1) 36 { 37 //skip the IPv6 addr 38 continue; 39 } 40 41 logger.debug("Interface: " + ni.getName() 42 + ", IP: " + ip); 43 ipList.add(ip); 44 } 45 } 46 47 Collections.sort(ipList); 48 } 49 catch (Exception e) 50 { 51 e.printStackTrace(); 52 logger.error("Failed to get local ip list. " + e.getMessage()); 53 throw new RuntimeException("Failed to get local ip list"); 54 } 55 56 return ipList; 57 } 58 59 public static void getLocalIpAddr(Set<String> set) 60 { 61 ArrayList<String> addrList = getLocalIpAddr(); 62 set.clear(); 63 for (String ip : addrList) 64 { 65 set.add(ip); 66 } 67 } 68 69 public static void main(String args[]) 70 { 71 //ArrayList<String> addrList = getLocalIpAddr(); 72 HashSet<String> addrSet = new HashSet<String>(); 73 getLocalIpAddr(addrSet); 74 for (String ip : addrSet) 75 { 76 System.out.println("Local ip:" + ip); 77 } 78 } 79 80 }