package act.util; /*- * #%L * ACT Framework * %% * Copyright (C) 2014 - 2017 ActFramework * %% * 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. * #L% */ import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; /** * Credential: source code copied from https://gist.github.com/pfmiles/9f7273b12b4b486e2e9c */ class LocalIpAddressUtil { /** * 获取本地ip地址,有可能会有多个地址, 若有多个网卡则会搜集多个网卡的ip地址 */ public static Set<InetAddress> resolveLocalAddresses() { Set<InetAddress> addrs = new HashSet<InetAddress>(); Enumeration<NetworkInterface> ns = null; try { ns = NetworkInterface.getNetworkInterfaces(); } catch (SocketException e) { // ignored... } while (ns != null && ns.hasMoreElements()) { NetworkInterface n = ns.nextElement(); Enumeration<InetAddress> is = n.getInetAddresses(); while (is.hasMoreElements()) { InetAddress i = is.nextElement(); if (!i.isLoopbackAddress() && !i.isLinkLocalAddress() && !i.isMulticastAddress() && !isSpecialIp(i.getHostAddress())) addrs.add(i); } } return addrs; } public static Set<String> resolveLocalIps() { Set<InetAddress> addrs = resolveLocalAddresses(); Set<String> ret = new HashSet<String>(); for (InetAddress addr : addrs) ret.add(addr.getHostAddress()); return ret; } /** * 取得当前机器的address信息,若有多个则随机选一个 */ public static InetAddress resolveLocalAddress() { Set<InetAddress> addrs = resolveLocalAddresses(); if (addrs != null && !addrs.isEmpty()) return addrs.iterator().next(); return null; } public static String ip() { InetAddress addr = resolveLocalAddress(); if (null == addr) { // you are running the app in a host without network connection return "127.0.0.1"; } return addr.getHostAddress(); } private static boolean isSpecialIp(String ip) { if (ip.contains(":")) return true; if (ip.startsWith("127.")) return true; if (ip.startsWith("169.254.")) return true; if (ip.equals("255.255.255.255")) return true; return false; } }