Wie erhält man die lokale IP-Adresse in Java genau? Die meisten Methoden im Internet sind InetAddress.getLocalHost().getHostAddress()
. Dadurch kann zwar die lokale IP-Adresse ermittelt werden, dies ist jedoch ungenau. Da ein Problem ignoriert wurde, ist die Netzwerkumgebung veränderbar. Verschiedene Netzwerkkarten auf einem Computer verfügen über mehrere IP-Adressen, z. B. LAN, WLAN, Bluetooth, Hotspots, Netzwerkkarten für virtuelle Maschinen usw.
127.xxx.xxx.xxx gehört zur „Loopback“-Adresse, das heißt, sie kann nur von Ihrem eigenen Computer gesehen werden, was die lokale Adresse ist. 0.1
192.168 xxx.xxx ist eine private Privatadresse (lokale Standortadresse), die innerhalb der lokalen Organisation zugänglich ist und nur im lokalen LAN sichtbar ist
Gleiche wie 10.xxx.xxx.xxx , von 172.16.xxx.xxx bis 172.31.xxx.xxx Sie sind alle private Adressen und dienen dem internen Zugriff innerhalb der Organisation. 169.254.xxx.xxx ist eine lokale Link-IP und ist in einem separaten Netzwerksegment verfügbar .xxx.xxx bis 239.xxx .xxx.xxx gehört zur Multicast-Adresse
Die spezielle 255.255.255.255 gehört zur Broadcast-Adresse
Andere Adressen sind Punkt-zu-Punkt verfügbare öffentliche IPv4-Adressen
2. Erhalten Sie
public static void main(String[] args) throws SocketException { System.out.println( IpUtil.getLocalIp4Address().get().toString().replaceAll("/","")); }
Referenz:
package com.dingwen.test.utils; import org.springframework.util.ObjectUtils; import java.net.*; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Optional; /** * 获取本机IP 地址 * * @author dingwen * 2021.04.28 11:49 */ public class IpUtil { /* * 获取本机所有网卡信息 得到所有IP信息 * @return Inet4Address> */ public static List<Inet4Address> getLocalIp4AddressFromNetworkInterface() throws SocketException { List<Inet4Address> addresses = new ArrayList<>(1); // 所有网络接口信息 Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); if (ObjectUtils.isEmpty(networkInterfaces)) { return addresses; } while (networkInterfaces.hasMoreElements()) { NetworkInterface networkInterface = networkInterfaces.nextElement(); //滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头 if (!isValidInterface(networkInterface)) { continue; } // 所有网络接口的IP地址信息 Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses(); while (inetAddresses.hasMoreElements()) { InetAddress inetAddress = inetAddresses.nextElement(); // 判断是否是IPv4,并且内网地址并过滤回环地址. if (isValidAddress(inetAddress)) { addresses.add((Inet4Address) inetAddress); } } } return addresses; } /** * 过滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头 * * @param ni 网卡 * @return 如果满足要求则true,否则false */ private static boolean isValidInterface(NetworkInterface ni) throws SocketException { return !ni.isLoopback() && !ni.isPointToPoint() && ni.isUp() && !ni.isVirtual() && (ni.getName().startsWith("eth") || ni.getName().startsWith("ens")); } /** * 判断是否是IPv4,并且内网地址并过滤回环地址. */ private static boolean isValidAddress(InetAddress address) { return address instanceof Inet4Address && address.isSiteLocalAddress() && !address.isLoopbackAddress(); } /* * 通过Socket 唯一确定一个IP * 当有多个网卡的时候,使用这种方式一般都可以得到想要的IP。甚至不要求外网地址8.8.8.8是可连通的 * @return Inet4Address> */ private static Optional<Inet4Address> getIpBySocket() throws SocketException { try (final DatagramSocket socket = new DatagramSocket()) { socket.connect(InetAddress.getByName("8.8.8.8"), 10002); if (socket.getLocalAddress() instanceof Inet4Address) { return Optional.of((Inet4Address) socket.getLocalAddress()); } } catch (UnknownHostException networkInterfaces) { throw new RuntimeException(networkInterfaces); } return Optional.empty(); } /* * 获取本地IPv4地址 * @return Inet4Address> */ public static Optional<Inet4Address> getLocalIp4Address() throws SocketException { final List<Inet4Address> inet4Addresses = getLocalIp4AddressFromNetworkInterface(); if (inet4Addresses.size() != 1) { final Optional<Inet4Address> ipBySocketOpt = getIpBySocket(); if (ipBySocketOpt.isPresent()) { return ipBySocketOpt; } else { return inet4Addresses.isEmpty() ? Optional.empty() : Optional.of(inet4Addresses.get(0)); } } return Optional.of(inet4Addresses.get(0)); } }
Das obige ist der detaillierte Inhalt vonSo schreiben Sie Code, um die lokale IP-Adresse in Java zu erhalten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!