以前在linux下获取ip和mac一般使用jni,调用linux的ioctl。当然也有使用shell获取的。 发现在jdk 6下已经实现了,java.net.NetworkInterface上面有静态方法可以获取到所有本地网卡信息。注意的是用Java的InetAddress.getLocalHost()方法在Linux下只能得到127.0.0.1,只能在Windows下获取正确的ip地址. 代码如下 package test; import java.io.*; import java.net.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import static java.lang.System.out; public class ListNIFs { public static void main(String args[]) throws SocketException { Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); for (NetworkInterface netIf : Collections.list(nets)) { String name = netIf.getDisplayName(); if(name.equals("eth0")) { out.printf("Display name: %s\n", netIf.getDisplayName()); out.printf("Name: %s\n", netIf.getName()); byte [] mac = netIf.getHardwareAddress(); String macs =Hex.encodeHexStr(mac); out.printf("Name: %s\n", macs); //displaySubInterfaces(netIf); out.printf("\n"); } } printHardwareAddresses(); } static void printHardwareAddresses() throws SocketException { if (System.getProperty("os.name").equals("Linux")) { // Read all available device names List<String> devices = new ArrayList<>(); Pattern pattern = Pattern.compile("^ *(.*):"); try (FileReader reader = new FileReader("/proc/net/dev")) { BufferedReader in = new BufferedReader(reader); String line = null; while( (line = in.readLine()) != null) { Matcher m = pattern.matcher(line); if (m.find()) { devices.add(m.group(1)); } } } catch (IOException e) { e.printStackTrace(); } // read the hardware address for each device for (String device : devices) { try (FileReader reader = new FileReader("/sys/class/net/" + device + "/address")) { BufferedReader in = new BufferedReader(reader); String addr = in.readLine(); System.out.println(String.format("%5s: %s", device, addr)); } catch (IOException e) { e.printStackTrace(); } } } else { // use standard API for Windows & Others (need to test on each platform, though!!) } } |
|