问题描述:
在某次重启服务后,发现程序获取到的本机IP地址与重启前不一致,导致部分内置客户端未启动,获取本机IP的方法如下:
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
public class InetAddressUtil {
/**
* 获取本机IPv4地址
* @return IP
*/
public static String getInet4Address(){
Enumeration<NetworkInterface> nis;
String ip = "127.0.0.1";
try{
nis = NetworkInterface.getNetworkInterfaces();
while(nis.hasMoreElements()){
NetworkInterface ni = nis.nextElement();
Enumeration<InetAddress> ias = ni.getInetAddresses();
while (ias.hasMoreElements()){
InetAddress ia = ias.nextElement();
ip = ia.getHostAddress();
if(ia instanceof Inet4Address && !"127.0.0.1".equals(ip)){
return ip;
}
}
}
}catch (SocketException e){
e.printStackTrace();
throw new RuntimeException("获取服务器IP地址异常");
}
return ip;
}
}
问题排查:
经排查,服务器在服务重启前新增多张网卡,而上述方法获取IP时,每次获取的都是最后一条IP地址,造成服务重启后IP地址不一致。
解决方案:
修改获取IP的方法,获取索引值最小的网卡的IP地址,确保每次获取的IP地址一致,修改后方法如下:
public String getInet4Address() {
InetAddress result = null;
try {
// 记录网卡最小索引
int lowest = Integer.MAX_VALUE;
// 获取所有网卡
for (Enumeration<NetworkInterface> nics = NetworkInterface
.getNetworkInterfaces(); nics.hasMoreElements();) {
NetworkInterface ifc = nics.nextElement();
if (ifc.isUp()) {
if (ifc.getIndex() < lowest || result == null) {
lowest = ifc.getIndex(); // 记录索引
}
else if (result != null) {
continue;
}
for (Enumeration<InetAddress> addrs = ifc
.getInetAddresses(); addrs.hasMoreElements();) {
InetAddress address = addrs.nextElement();
if (address instanceof Inet4Address
&& !address.isLoopbackAddress()) {
result = address;
}
}
}
}
}
catch (Exception ex) {
log.error("找不到有效的IPv4地址", ex);
}
if (result != null) {
return result.getHostAddress();
}
return "127.0.0.1";
}