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);
}
}