package com.anduo.filesync.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.NetworkInterface; import java.net.SocketAddress; import java.util.Enumeration; import java.util.regex.Pattern; /** * Date: 12/1/14 * Time: 7:18 PM */ public class NetUtil { private static final Logger LOGGER = LoggerFactory.getLogger(NetUtil.class); private static volatile InetAddress LOCAL_ADDRESS = null; public static InetAddress getLocalAddress() { if (LOCAL_ADDRESS != null) { return LOCAL_ADDRESS; } InetAddress localAddress = getLocalAddress0(); LOCAL_ADDRESS = localAddress; return localAddress; } private static InetAddress getLocalAddress0() { InetAddress localAddress = null; try { localAddress = InetAddress.getLocalHost(); if (isValidAddress(localAddress)) { return localAddress; } } catch (Throwable e) { LOGGER.warn("Failed to retriving ip address, " + e.getMessage(), e); } try { Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); if (interfaces != null) { while (interfaces.hasMoreElements()) { try { NetworkInterface network = interfaces.nextElement(); Enumeration<InetAddress> addresses = network.getInetAddresses(); if (addresses != null) { while (addresses.hasMoreElements()) { try { InetAddress address = addresses.nextElement(); if (isValidAddress(address)) { return address; } } catch (Throwable e) { LOGGER.warn("Failed to retriving ip address, " + e.getMessage(), e); } } } } catch (Throwable e) { LOGGER.warn("Failed to retriving ip address, " + e.getMessage(), e); } } } } catch (Throwable e) { LOGGER.warn("Failed to retriving ip address, " + e.getMessage(), e); } LOGGER.error("Could not get local host ip address, will use 127.0.0.1 instead."); return localAddress; } private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$"); private static boolean isValidAddress(InetAddress address) { if (address == null || address.isLoopbackAddress()) { return false; } String name = address.getHostAddress(); return (name != null && !ANYHOST.equals(name) && !LOCALHOST.equals(name) && IP_PATTERN.matcher(name).matches()); } public static final String LOCALHOST = "127.0.0.1"; public static final String ANYHOST = "0.0.0.0"; public static SocketAddress createSocketAddress(String server) { String[] serverSplit = server.split(":"); String hostname = serverSplit[0]; int port = Integer.parseInt(serverSplit[1]); return new InetSocketAddress(hostname, port); } }