以前在linux下獲取ip和mac一般使用jni,調(diào)用linux的ioctl。當(dāng)然也有使用shell獲取的。 發(fā)現(xiàn)在jdk 6下已經(jīng)實(shí)現(xiàn)了,java.net.NetworkInterface上面有靜態(tài)方法可以獲取到所有本地網(wǎng)卡信息。注意的是用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!!) } } |
|
來(lái)自: 真愛(ài)圖書(shū) > 《linux》