四、获取IP地址工具包

由于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之类的东西。

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

时间: 2024-08-25 19:28:31

四、获取IP地址工具包的相关文章

DHCP获取IP地址过程中捕获的报文—三级网络总结(二)

上一篇文章主要说了一下知识点中的IP地址的考点,这一篇我打算说说DHCP获取IP地址过程中捕获的报文的这个考点,都是自己的理解,有错误欢迎指正. DHCP是应用层协议,UDP是传输层协议,IP是网络层协议,以太网是链路层协议.数据在网络上传输的时候要自顶向下逐层封装的,典型的DHCP过程是这样的: 1:客户机向服务器发送DHCP_DISCOVER报文,申请IP. 2:服务器向客户机返会DHCP_OFFER报文,指定一个将要分配的IP. 3:客户机向服务器发送DHCP_REQUEST报文,请求这个

六、DHCP获取IP地址过程中捕获的报文

DHCP是应用层协议,UDP是传输层协议,IP是网络层协议,以太网是链路层协议.数据在网络上传输的时候要自顶向下逐层封装的,典型的DHCP过程是这样的:1:客户机向服务器发送DHCP_DISCOVER报文,申请IP.2:服务器向客户机返会DHCP_OFFER报文,指定一个将要分配的IP.3:客户机向服务器发送DHCP_REQUEST报文,请求这个IP.4:服务器PING几次(一般是3次)这个IP,如果没得到响应的话,就说明这个IP现在空闲,可以分配给客户机,所以向客户机发送DHCP_ACK报文,

【ASP.NET】ASP.NET获取IP地址的六种方法

服务端: //方法一 HttpContext.Current.Request.UserHostAddress;  //方法二 HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; //方法三 string strHostName = System.Net.Dns.GetHostName(); string clientIPAddress = System.Net.Dns.GetHostAddresses(strHostN

在RHEL中搭建DHCP服务使得windows系统能自动获取IP地址

实验环境: RHEL6.5版本.Windows7系统各一台RHEL6.5版本的IP地址:192.168.100.222 本实验所使用到的一些命令: cd 切换目录 rpm 添加/删除程序功能 cat 查看文件 cp 复制 vim 编辑文件 service 启动/关闭某个程序 ---------------------------------操作步骤---------------------------------------- 一.检查光驱是否已经挂载在mnt目录下. 二.安装DHCP. 三.到

如何搭建DHCP服务器及自动获取IP地址及相关操作

DHCP服务相关理论知识 DHCP服务分为以下三点, IP地址(例:192.168.1.0) 子网掩码(例:255.255.255.0) 网关 DHCP服务的好处: 减少管理员的工作量 避免输入错误的可能 避免IP冲突 提高了IP地址的利用率 方便客户端的配置 DHCP服务的分配方式: 自动分配:分配到一个IP地址后永久使用 手动分配:由DCHP服务器管理员专门指定IP地址 动态分配:使用完之后释放该IP,供其它客户机使用 DHCP租约的过程(四个步骤):1.客户机请求IP(Discover):

获取IP地址

获取本地计算机的IP地址 关键点 WSAStartup The Windows Sockets WSAStartup function initiates use of Ws2_32.dll by a process. int WSAStartup( WORDwVersionRequested, LPWSADATAlpWSAData ); 实现过程 #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") char* 

ARM-Linux配置DHCP自动获取IP地址

备注:内核版本:2.6.30.9busybox版本:1.15.2 PC Linux和开发板Linux的工作用户:root 1. 配置内核:[*] Networking support --->Networking options ---><*> Packet socket<*> Unix domain sockets[*] TCP/IP networking[*] IP: kernel level autoconfiguration[*] IP: DHCP suppor

自动设置IP地址和自动获取IP地址bat批处理文件

自动设置IP地址.bat Echo offecho  手动设置IP地址....Netsh interface IP Set Addr "本地连接" Static 192.168.1.8 255.255.255.0 192.168.1.1 1echo  手动设置DNS地址....Netsh interface IP Set dns "本地连接" static 202.106.196.115 primaryecho  手动设置备份DNS地址....Netsh inter

CentOS 7如何设置Linux开机自动获取IP地址

centos7 minimal版默认安装好后没有获取ip地址,需要手动配置.方法如下: 1.输入“ip addr”并按回车键确定,发现无法获取IP(CentOS 7默认没有ifconfig命令),记录下网卡名称(本例中为ens33). 2.输入“cd /etc/sysconfig/network-scripts/”按回车键确定,继续输入“ls”按回车键查看文件. 3.输入“vi ifcfg-ens33”并按回车键确定(网卡名称可能不同).亦可在第二步直接输入“cd /etc/sysconfig/