如何正确获取本地IP?(收藏)
1
2
InetAddress.getLocalHost().getHostAddress();public static String getLocalAddress() {try {// 获取所在机器上的所有网卡Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces();ArrayList<String> ipv4Result = new ArrayList<String>();ArrayList<String> ipv6Result = new ArrayList<String>();// 遍历获取所有网卡绑定的全部IP地址,并按照IPV4和IPV6分开存放while (enumeration.hasMoreElements()) {final NetworkInterface networkInterface = enumeration.nextElement();final Enumeration<InetAddress> en = networkInterface.getInetAddresses();while (en.hasMoreElements()) {final InetAddress address = en.nextElement();if (!address.isLoopbackAddress()) {if (address instanceof Inet6Address) {ipv6Result.add(normalizeHostAddress(address));} else {ipv4Result.add(normalizeHostAddress(address));}}}}// 优先返回IPV4的非回路和非私有地址if (!ipv4Result.isEmpty()) {for (String ip : ipv4Result) {if (ip.startsWith("127.0") || ip.startsWith("192.168")) {continue;}return ip;}return ipv4Result.get(ipv4Result.size() - 1);} else if (!ipv6Result.isEmpty()) {return ipv6Result.get(0);}// 如果获取失败,降级到根据localhost获取地址final InetAddress localHost = InetAddress.getLocalHost();return normalizeHostAddress(localHost);} catch (Exception e) {log.error("Failed to obtain local address", e);}return null;}// 工具方法,规范IP地址格式private static String normalizeHostAddress(final InetAddress localHost) {if (localHost instanceof Inet6Address) {return "[" + localHost.getHostAddress() + "]";} else {return localHost.getHostAddress();}}
聊技术,不止于技术。
评论
