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 }

 

posted @ 2018-10-16 11:48  桔子在路上  阅读(31518)  评论(0编辑  收藏  举报