banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

[Linux]Java获取本机网卡IP地址

应用程序服务器由 Windows 环境整体迁移到 Linux 环境,出现了不能获取本机 IP 地址的问题 原因是下面一段 JAVA 代码在 Linux 下直接返回 127.0.0.1。Windows 下有效的 InetAddress 貌似在 linux 下不起作用。

public static String getLocalIP() {
String ip = "";
try {
InetAddress address = InetAddress.getLocalHost();
if(address != null) {
ip = address.getHostAddress();
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
return ip;
}

原因在于 Java 使用的 JNI 代码调用的是 Linux 中的 gethostname 内核函数 这个函数在 Linux 主机没有绑定 IP 的情况下根据 Host 文件定义返回默认的 localhost 或者 127.0.0.1。

后改为改用 NetworkInterface 方式获取,可以取得 IP 地址。

public static String getLocalIP() {
Enumeration allNetInterfaces = NetworkInterface.getNetworkInterfaces();
InetAddress ip = null;
while (allNetInterfaces.hasMoreElements()) {
NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement();
System.out.println(netInterface.getName());
Enumeration addresses = netInterface.getInetAddresses();
while (addresses.hasMoreElements()) {
ip = (InetAddress) addresses.nextElement();
if (ip != null && ip instanceof Inet4Address) {
return ip.getHostAddress();
}
}
}
}
return "";
}

最后考虑到多块网卡问题,需要对多个 NetworkInterface 进行遍历,这里只取 IPV4 的 IP 地址

public static List getLocalIPList() {
List ipList = new ArrayList();
try {
Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces();
NetworkInterface networkInterface;
Enumeration inetAddresses;
InetAddress inetAddress;
String ip;
while (networkInterfaces.hasMoreElements()) {
networkInterface = networkInterfaces.nextElement();
inetAddresses = networkInterface.getInetAddresses();
while (inetAddresses.hasMoreElements()) {
inetAddress = inetAddresses.nextElement();
if (inetAddress != null && inetAddress instanceof Inet4Address) { // IPV4
ip = inetAddress.getHostAddress();
ipList.add(ip);
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return ipList;
}

参考 http://www.linuxidc.com/Linux/2012-12/75498.htm https://my.oschina.net/zhongwenhao/blog/307879 http://www.blogjava.net/icewee/archive/2013/07/19/401739.html

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.