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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM