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

org.macrocloud.kernel.launch.utils.INetUtil Maven / Gradle / Ivy

The newest version!

package org.macrocloud.kernel.launch.utils;

import org.springframework.util.StringUtils;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.UnknownHostException;
import java.util.Enumeration;

/**
 * INet 相关工具
 *
 * @author macro
 */
public class INetUtil {
	public static final String LOCAL_HOST = "127.0.0.1";

	/**
	 * 获取 服务器 hostname
	 *
	 * @return hostname
	 */
	public static String getHostName() {
		String hostname;
		try {
			InetAddress address = InetAddress.getLocalHost();
			// force a best effort reverse DNS lookup
			hostname = address.getHostName();
			if (StringUtils.isEmpty(hostname)) {
				hostname = address.toString();
			}
		} catch (UnknownHostException ignore) {
			hostname = LOCAL_HOST;
		}
		return hostname;
	}

	/**
	 * 获取 服务器 HostIp
	 *
	 * @return HostIp
	 */
	public static String getHostIp() {
		String hostAddress;
		try {
			InetAddress address = INetUtil.getLocalHostLANAddress();
			// force a best effort reverse DNS lookup
			hostAddress = address.getHostAddress();
			if (StringUtils.isEmpty(hostAddress)) {
				hostAddress = address.toString();
			}
		} catch (UnknownHostException ignore) {
			hostAddress = LOCAL_HOST;
		}
		return hostAddress;
	}

	/**
	 * https://stackoverflow.com/questions/9481865/getting-the-ip-address-of-the-current-machine-using-java
	 *
	 * 

* Returns an InetAddress object encapsulating what is most likely * the machine's LAN IP address. *

* This method is intended for use as a replacement of JDK method * InetAddress.getLocalHost, because that method is ambiguous on * Linux systems. Linux systems enumerate the loopback network interface the * same way as regular LAN network interfaces, but the JDK * InetAddress.getLocalHost method does not specify the algorithm * used to select the address returned under such circumstances, and will often * return the loopback address, which is not valid for network communication. * Details here. *

* This method will scan all IP addresses on all network interfaces on the host * machine to determine the IP address most likely to be the machine's LAN * address. If the machine has multiple IP addresses, this method will prefer a * site-local IP address (e.g. 192.168.x.x or 10.10.x.x, usually IPv4) if the * machine has one (and will return the first site-local address if the machine * has more than one), but if the machine does not hold a site-local address, * this method will return simply the first non-loopback address found (IPv4 or * IPv6). *

* If this method cannot find a non-loopback address using this selection * algorithm, it will fall back to calling and returning the result of JDK * method InetAddress.getLocalHost. *

* * @throws UnknownHostException If the LAN address of the machine cannot be * found. */ private static InetAddress getLocalHostLANAddress() throws UnknownHostException { try { InetAddress candidateAddress = null; // Iterate all NICs (network interface cards)... for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements();) { NetworkInterface iface = (NetworkInterface) ifaces.nextElement(); // Iterate all IP addresses assigned to each card... for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements();) { InetAddress inetAddr = (InetAddress) inetAddrs.nextElement(); if (!inetAddr.isLoopbackAddress()) { if (inetAddr.isSiteLocalAddress()) { // Found non-loopback site-local address. Return it immediately... return inetAddr; } else if (candidateAddress == null) { // Found non-loopback address, but not necessarily site-local. // Store it as a candidate to be returned if site-local address is not // subsequently found... candidateAddress = inetAddr; // Note that we don't repeatedly assign non-loopback non-site-local addresses as // candidates, // only the first. For subsequent iterations, candidate will be non-null. } } } } if (candidateAddress != null) { // We did not find a site-local address, but we found some other non-loopback // address. // Server might have a non-site-local address assigned to its NIC (or it might // be running // IPv6 which deprecates the "site-local" concept). // Return this non-loopback candidate address... return candidateAddress; } // At this point, we did not find a non-loopback address. // Fall back to returning whatever InetAddress.getLocalHost() returns... InetAddress jdkSuppliedAddress = InetAddress.getLocalHost(); if (jdkSuppliedAddress == null) { throw new UnknownHostException("The JDK InetAddress.getLocalHost() method unexpectedly returned null."); } return jdkSuppliedAddress; } catch (Exception e) { UnknownHostException unknownHostException = new UnknownHostException( "Failed to determine LAN address: " + e); unknownHostException.initCause(e); throw unknownHostException; } } /** * 尝试端口时候被占用 * * @param port 端口号 * @return 没有被占用:true,被占用:false */ public static boolean tryPort(int port) { try (ServerSocket ignore = new ServerSocket(port)) { return true; } catch (Exception e) { return false; } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy