在服务器获取ip时有时是0.0.0.0这样的,以下的方式可以准确获取本机ip
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
public class IpUtil {
/**
* 获取本机的ip地址
*/
private static InetAddress getLocalHostLANAddress() {
try {
InetAddress candidateAddress = null;
// 遍历所有的网络接口
for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements(); ) {
NetworkInterface iface = (NetworkInterface) ifaces.nextElement();
// 在所有的接口下再遍历IP
for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements(); ) {
InetAddress inetAddr = (InetAddress) inetAddrs.nextElement();
if (!inetAddr.isLoopbackAddress()) {// 排除loopback类型地址
if (inetAddr.isSiteLocalAddress()) {
// 如果是site-local地址,就是它了
return inetAddr;
} else if (candidateAddress == null) {
// site-local类型的地址未被发现,先记录候选地址
candidateAddress = inetAddr;
}
}
}
}
if (candidateAddress != null) {
return candidateAddress;
}
// 如果没有发现 non-loopback地址.只能用最次选的方案
InetAddress jdkSuppliedAddress = InetAddress.getLocalHost();
return jdkSuppliedAddress;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取本机的ip地址
*/
public static String getLocalHostAddress() {
String address = getLocalHostLANAddress().toString();
// 取得的地址为 "/xxx.xx.xx.xx"格式
if (address.startsWith("/")) {
address = address.substring(1, address.length());
}
return address;
}
}
获取本地的MAC地址,转载自https://blog.csdn.net/cdnight/article/details/86741265
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 获取MAC地址
*/
public class MacAddressUtil {
public static String getMacAddress() {
try {
List<String> macList = getMacList();
if (macList != null && macList.size() > 0) {
return macList.get(0);
}
} catch (Exception ex) {
}
return null;
}
/***因为一台机器不一定只有一个网卡呀,所以返回的是数组是很合理的***/
private static List<String> getMacList() throws Exception {
java.util.Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();
StringBuilder sb = new StringBuilder();
ArrayList<String> tmpMacList = new ArrayList<>();
while (en.hasMoreElements()) {
NetworkInterface iface = en.nextElement();
List<InterfaceAddress> addrs = iface.getInterfaceAddresses();
for (InterfaceAddress addr : addrs) {
InetAddress ip = addr.getAddress();
NetworkInterface network = NetworkInterface.getByInetAddress(ip);
if (network == null) {
continue;
}
byte[] mac = network.getHardwareAddress();
if (mac == null) {
continue;
}
sb.delete(0, sb.length());
for (int i = 0; i < mac.length; i++) {
sb.append(String.format("%02X", mac[i]));
}
tmpMacList.add(sb.toString());
}
}
if (tmpMacList.size() <= 0) {
return tmpMacList;
}
//重,别忘了同一个网卡的ipv4,ipv6得到的mac都是一样的,肯定有重复
List<String> unique = tmpMacList.stream().distinct().collect(Collectors.toList());
return unique;
}
}