Java 实现获取真实IP与MAC地址的解决方案

需积分: 9 5 下载量 144 浏览量 更新于2024-09-17 收藏 17KB DOCX 举报
"在Java编程中,获取本机IP地址是一项常见的任务,特别是在处理网络通信或需要连接服务器时。然而,初学者可能会遇到困惑,因为`InetAddress.getLocalHost()`方法返回的是本地主机的IP地址,而非网卡的实际IP,这通常会是`127.0.1.1`或`localhost`。这个问题源于操作系统中的`etc/hosts`文件,该文件将`localhost`映射到本机的环回地址。 解决这个问题,你需要通过更底层的网络接口操作来获取真实的IP地址。Java提供了一套API,如`java.net.NetworkInterface`和`java.net.InetAddress`,可以帮助我们实现这一目标。以下是一个示例程序,展示了如何在Linux环境下获取网卡的IP地址和MAC地址: ```java import java.net.*; import java.util.*; public class GetIP { public static void main(String[] args) { GetIP t = new GetIP(); System.out.println("本地IP地址: " + t.getLocalIP()); System.out.println("MAC地址: " + t.getMacAddr()); } public String getLocalIP() { try { Enumeration<NetworkInterface> e1 = NetworkInterface.getNetworkInterfaces(); while (e1.hasMoreElements()) { NetworkInterface ni = (NetworkInterface) e1.nextElement(); if (!ni.isUp() || ni.isLoopback() || ni.isVirtual()) continue; // 忽略不适用的接口 InetAddress addr = ni.getInetAddresses(); for (InetAddress inet : addr) { if (!inet.equals(InetAddress.getByName("127.0.0.1"))) { // 不是环回地址 return inet.getHostAddress(); } } } } catch (SocketException e) { e.printStackTrace(); } return null; } public String getMacAddr() { String macAddr = ""; try { NetworkInterface nic = NetworkInterface.getByName("eth0"); // 可能需要根据实际网卡名称替换 byte[] buf = nic.getHardwareAddress(); for (int i = 0; i < buf.length; i++) { macAddr += byteToHex(buf[i]); } macAddr = macAddr.toUpperCase(); } catch (SocketException e) { e.printStackTrace(); System.exit(-1); } return macAddr; } // 辅助函数,将字节转换为十六进制字符串 private String byteToHex(byte b) { int n = b & 0xff; return Integer.toHexString(n).toUpperCase(); } } ``` 在这个示例中,`getLocalIP()`方法遍历所有网络接口,查找第一个非环回地址的IP,而`getMacAddr()`方法则用于获取网卡的物理地址(MAC地址)。请注意,实际应用中可能需要根据具体的网络设备名称(如`eth0`)进行调整。通过执行这段代码,你将能够在控制台看到计算机的真实IP地址和MAC地址,而不是仅限于`127.0.1.1`。