All Downloads are FREE. Search and download functionalities are using the official Maven repository.

me.aifaq.commons.lang.IpUtil Maven / Gradle / Ivy

The newest version!
package me.aifaq.commons.lang;

import org.apache.commons.lang3.ArrayUtils;

import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * @author Wang Wei [[email protected]]
 * @since 10:10 2017/5/17
 */
public class IpUtil {
	private static final String DEFAULT_LOCAL_IP = "127.0.0.1";
	private static final Logger logger = Logger.getLogger(IpUtil.class.getName());

	public static final String LOCAL_IP;

	static {
		LOCAL_IP = getLocalIp();
		// 打印本地IP
		System.out.println("LOCAL_IP: " + LOCAL_IP);
	}

	/**
	 * 获取本地IP
	 */
	static String getLocalIp() {
		try {
			// 遍历网卡,查找一个非回路ip地址并返回
			Enumeration enumeration = NetworkInterface.getNetworkInterfaces();
			InetAddress inet6Address = null;
			while (enumeration.hasMoreElements()) {
				NetworkInterface networkInterface = enumeration.nextElement();
				Enumeration inetAddresses = networkInterface.getInetAddresses();
				while (inetAddresses.hasMoreElements()) {
					InetAddress inetAddress = inetAddresses.nextElement();
					if (!inetAddress.isLoopbackAddress() && inetAddress.isSiteLocalAddress()) {
						if (inetAddress instanceof Inet6Address) {
							inet6Address = inetAddress;
						}
						else {
							// 优先使用ipv4
							return normalizeHostAddress(inetAddress);
						}
					}
				}
			}
			// 没有ipv4,再使用ipv6
			if (inet6Address != null) {
				return normalizeHostAddress(inet6Address);
			}
			return normalizeHostAddress(InetAddress.getLocalHost());
		}
		catch (Exception e) {
			logger.log(Level.WARNING, "获取本地IP出错", e);
			return DEFAULT_LOCAL_IP;
		}
	}

	static String normalizeHostAddress(InetAddress inetAddress) {
		if (inetAddress instanceof Inet6Address) {
			return "[" + inetAddress.getHostAddress() + "]";
		}
		else {
			return inetAddress.getHostAddress();
		}
	}

	/**
	 * 获取本地物理网卡地址
	 */
	public static String getPhysicalAddress() {
		try {
			Enumeration enumeration = NetworkInterface.getNetworkInterfaces();
			while (enumeration.hasMoreElements()) {
				NetworkInterface networkInterface = enumeration.nextElement();
				Enumeration inetAddresses = networkInterface.getInetAddresses();
				while (inetAddresses.hasMoreElements()) {
					InetAddress inetAddress = inetAddresses.nextElement();
					// isSiteLocalAddress方法
					// 当IP地址是地区本地地址(SiteLocalAddress)时返回true,否则返回false。IPv4的地址本地
					// 地址分为三段:10.0.0.0 ~ 10.255.255.255、172.16.0.0 ~
					// 172.31.255.255、192.168.0.0
					// ~ 192.168.255.255。IPv6的地区本地地址的前12位是FEC,其他的位可以是任意取值,
					// 如FED0::、FEF1::都是地区本地地址。

					// isLoopbackAddress方法
					// 当IP地址是loopback地址时返回true,否则返回false。loopback地址就是代表本机的IP地址。
					// IPv4的loopback地址的范围是127.0.0.0 ~
					// 127.255.255.255,也就是说,只要第一个字节是127,
					// 就是lookback地址。如127.1.2.3、127.0.200.200都是loopback地址。IPv6的loopback地址是
					// 0:0:0:0:0:0:0:1,也可以简写成::1。
					if (!inetAddress.isLoopbackAddress() && inetAddress.isSiteLocalAddress()) {
						byte[] hardwareAddress = networkInterface.getHardwareAddress();
						if (ArrayUtils.isEmpty(hardwareAddress)) {
							continue;
						}
						StringBuilder result = new StringBuilder();
						for (byte b : hardwareAddress) {
							result.append("-");
							result.append(ByteUtil.toHexString(b));
						}
						return result.deleteCharAt(0).toString();
					}

				}
			}
		}
		catch (Exception e) {
			logger.log(Level.WARNING, "获取本地物理网卡地址出错", e);
		}
		return null;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy