码迷,mamicode.com
首页 > 其他好文 > 详细

四、获取IP地址工具包

时间:2019-02-13 12:59:48      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:linux   网络工具   except   .com   empty   mon   静态   多次   ati   

由于getHostAddress()方法在Linux下读取hosts文件获取的是127.0.0.1

InetAddress.getLocalHost().getHostAddress()

所以这里采用NetworkInterfaces + getInetAddresses来获取IP地址

import com.luckin.compass.base.common.constants.ReturnStatus;
import com.luckin.compass.base.common.exception.BusinessException;
import org.apache.commons.lang3.StringUtils;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;

/**
 * @Description 网络工具包
 * @Author lay 
 * @Date 2019/01/23 14:13
 */
public class NetUtil {
    private static String ip = "";

    /**
     * 通过NetworkInterfaces + getInetAddresses 获取IP地址
     * 注意:
     * 1)本方法将获取第一个ipv4地址,如果系统存在如虚拟机等将会有多个ipv4地址可选,可能导致获取到虚拟机地址
     * 2)由于该方法要遍历逻辑网络接口,是一个重量级方法,这里采用static来确保全局只获取一次
     * 3)为防止当前JVM中多次调用并发耗费资源,这里采用类锁控制
     * @return IP地址
     * @throws BusinessException 获取系统IP失败,getNetworkInterfaces()如果发生IO异常
     */
    public static String getHostAddress() {
        // 如果已经获取到了直接返回
        if (StringUtils.isNotEmpty(ip)) {
            return ip;
        }
        synchronized (NetUtil.class) {
            if (StringUtils.isNotEmpty(ip)) {
                return ip;
            }
            // 枚举所有逻辑网络接口
            Enumeration<NetworkInterface> en;
            try {
                en = NetworkInterface.getNetworkInterfaces();
            } catch (SocketException e) {
                throw new BusinessException(ReturnStatus.SC_INTERNAL_SERVER_ERROR, "获取网络逻辑接口发生IO异常", e);
            }
            // 遍历所有接口
            a: while (en.hasMoreElements()) {
                NetworkInterface networkInterface = en.nextElement();
                // 遍历该接口的所有地址
                for (Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses(); inetAddresses.hasMoreElements(); ) {
                    InetAddress inetAddress = inetAddresses.nextElement();
                    String      address     = inetAddress.getHostAddress();
                    // 排除ip6等其它选项
                    if (!address.contains("::") && !address.contains("0:0:") && !address.contains("fe80")) {
                        // 排除127
                        if (!inetAddress.isLoopbackAddress() && inetAddress.isSiteLocalAddress()) {
                            // 赋值到静态变量
                            ip = address;
                            // 取第一个即结束
                            break a;
                        }
                    }
                }
            }
        }
        if (StringUtils.isEmpty(ip)) {
            throw new BusinessException(ReturnStatus.SC_INTERNAL_SERVER_ERROR, "未能获取本机IP,IP=" + ip);
        }
        return ip;
    }
}

这种获取方式实际上也可能存在问题,如使用了VM或者docker之类的东西。

 

四、获取IP地址工具包

标签:linux   网络工具   except   .com   empty   mon   静态   多次   ati   

原文地址:https://www.cnblogs.com/lay2017/p/10368983.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!