以前在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 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 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!!)
}
}
阅读(4336) | 评论(0) | 转发(0) |