/*
* (C) Copyright 2015-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Contributors:
* ohun@live.cn (夜色)
*/
package com.mpush.tools;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.*;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
/**
* Created by ohun on 2015/12/25.
*
* @author ohun@live.cn
*/
public final class Utils {
private static final Logger LOGGER = LoggerFactory.getLogger(Utils.class);
private static String LOCAL_IP;
private static final Pattern LOCAL_IP_PATTERN = Pattern.compile("127(\\.\\d{1,3}){3}$");
private static String EXTRANET_IP;
public static boolean isLocalHost(String host) {
return host == null
|| host.length() == 0
|| host.equalsIgnoreCase("localhost")
|| host.equals("0.0.0.0")
|| (LOCAL_IP_PATTERN.matcher(host).matches());
}
public static String getLocalIp() {
if (LOCAL_IP == null) {
LOCAL_IP = getInetAddress(true);
}
return LOCAL_IP;
}
public static NetworkInterface getLocalNetworkInterface() {
Enumeration<NetworkInterface> interfaces;
try {
interfaces = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
throw new RuntimeException("NetworkInterface not found", e);
}
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = interfaces.nextElement();
Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress address = addresses.nextElement();
if (address.isLoopbackAddress()) continue;
if (address.getHostAddress().contains(":")) continue;
if (address.isSiteLocalAddress()) return networkInterface;
}
}
throw new RuntimeException("NetworkInterface not found");
}
public static InetAddress getInetAddress(String host) {
try {
return InetAddress.getByName(host);
} catch (UnknownHostException e) {
throw new IllegalArgumentException("UnknownHost " + host, e);
}
}
/**
* 只获取第一块网卡绑定的ip地址
*
* @param getLocal 局域网IP
* @return ip
*/
public static String getInetAddress(boolean getLocal) {
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
Enumeration<InetAddress> addresses = interfaces.nextElement().getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress address = addresses.nextElement();
if (address.isLoopbackAddress()) continue;
if (address.getHostAddress().contains(":")) continue;
if (getLocal) {
if (address.isSiteLocalAddress()) {
return address.getHostAddress();
}
} else {
if (!address.isSiteLocalAddress() && !address.isLoopbackAddress()) {
return address.getHostAddress();
}
}
}
}
LOGGER.debug("getInetAddress is null, getLocal={}", getLocal);
return getLocal ? "127.0.0.1" : null;
} catch (Throwable e) {
LOGGER.error("getInetAddress exception", e);
return getLocal ? "127.0.0.1" : null;
}
}
public static String getExtranetIp() {
if (EXTRANET_IP == null) {
EXTRANET_IP = getInetAddress(false);
}
return EXTRANET_IP;
}
public static String headerToString(Map<String, String> headers) {
if (headers != null && headers.size() > 0) {
StringBuilder sb = new StringBuilder(headers.size() * 64);
for (Map.Entry<String, String> entry : headers.entrySet()) {
sb.append(entry.getKey())
.append(':')
.append(entry.getValue()).append('\n');
}
return sb.toString();
}
return null;
}
public static Map<String, String> headerFromString(String headersString) {
if (headersString == null) return null;
Map<String, String> headers = new HashMap<>();
int L = headersString.length();
String name, value = null;
for (int i = 0, start = 0; i < L; i++) {
char c = headersString.charAt(i);
if (c != '\n') continue;
if (start >= L - 1) break;
String header = headersString.substring(start, i);
start = i + 1;
int index = header.indexOf(':');
if (index <= 0) continue;
name = header.substring(0, index);
if (index < header.length() - 1) {
value = header.substring(index + 1);
}
headers.put(name, value);
}
return headers;
}
public static boolean checkHealth(String ip, int port) {
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(ip, port), 1000);
socket.close();
return true;
} catch (IOException e) {
return false;
}
}
}