Java服务重启后,获取本机IP地址不一致的问题

问题描述:

        在某次重启服务后,发现程序获取到的本机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";
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值