Muchas veces, necesitamos obtener información del hardware del servidor (como la dirección MAC). Existen varios métodos comúnmente utilizados:
•Utilice el programa de línea de comando para obtener la información del disco duro, luego obtenga el flujo de salida a través de Runtime.getRuntime().exec y luego obtenga la dirección MAC a través del análisis de cadenas.
• Compile el programa local y luego llámelo a través de JNI.
Los dos métodos anteriores requieren distinguir diferentes plataformas de sistemas operativos y codificarlas por separado, lo cual es más problemático, como
• La plataforma Windows necesita usar el comando iptables /all
•La plataforma Linux necesita usar el comando ifconfig
Hoy presentaré un método de operación multiplataforma común, que es la interfaz NetworkInterface que viene con JDK. Esta interfaz apareció en JDK1.4, pero tiene relativamente pocas funciones. Después de JDK1.6, se agregaron muchas funciones nuevas. es bastante bueno.
Puede consultar la documentación de la API para funciones específicas. Aquí presentamos principalmente cómo obtener la dirección MAC del servidor. El código es el siguiente, con comentarios, por lo que no entraré en detalles.
Copie el código de código de la siguiente manera:
//Obtener las direcciones MAC de todas las tarjetas de red
Lista estática pública<Cadena> getAllMac() {
Lista<Cadena> lista = nueva ArrayList<Cadena>();
intentar {
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces() // Devuelve una instancia de enumeración de todas las interfaces de red.
mientras (e.hasMoreElements()) {
NetworkInterface network = e.nextElement();//Obtener la interfaz de red actual
si (red! = nulo) {
si (network.getHardwareAddress()! = nulo) {
// Obtener dirección MAC
//El resultado es una matriz de bytes, cada elemento es un byte, necesitamos convertirlo en una representación hexadecimal común mediante el método parseByte
byte[] direcciones = network.getHardwareAddress();
StringBuffer sb = nuevo StringBuffer();
if (direcciones! = nulo && direcciones.longitud > 1) {
sb.append(parseByte(direcciones[0])).append(":").append(
parseByte(direcciones[1])).append(":").append(
parseByte(direcciones[2])).append(":").append(
parseByte(direcciones[3])).append(":").append(
parseByte(direcciones[4])).append(":").append(
parseByte(direcciones[5]));
lista.add(sb.toString());
}
}
} demás {
System.out.println("Se produjo una excepción al obtener la dirección MAC");
}
}
} captura (SocketException e) {
e.printStackTrace();
}
lista de devolución;
}
//formato binario
cadena estática privada parseByte (byte b) {
int valorint = 0;
si (b >= 0) {
valorint = b;
} demás {
valorint = 256 + b;
}
devolver Integer.toHexString(intValue);
}
Luego, usamos el siguiente código de prueba para ver los resultados de la prueba.
Copie el código de código de la siguiente manera:
Lista<Cadena> lista = getAllMac();
para (cadena mac: lista) {
System.out.println(mac);
}
El resultado es el siguiente:
Copie el código de código de la siguiente manera:
0:18:8b:cc:xx:e3
0:0:0:0:0:0:0:e0
0:50:xx:c0:0:1
0:50:xx:c0:0:8
Todos descubrieron que "0:18:8b:cc:xx:e3" tiene solo un 0, lo que parece muy incómodo. También podríamos revisar el método parseByte de la siguiente manera:
Copie el código de código de la siguiente manera:
cadena estática privada parseByte (byte b) {
Cadena s = "00"+Integer.toHexString(byte0);
return s.substring(s.length() - 2);
}
Los resultados de salida cambian:
Copie el código de código de la siguiente manera:
00:18:8b:cc:xx:e3
00:00:00:00:00:e0
00:50:xx:c0:00:01
00:50:xx:c0:00:08
Parece más cómodo así, ¿verdad?
Además, la interfaz NetworkInterface también proporciona los siguientes métodos, a los que puede consultar.
•String displayName() Obtiene el nombre para mostrar de la interfaz de red.
•int getMTU() devuelve la Unidad de Transmisión Máxima (MTU) de esta interfaz
•String getName() obtiene el nombre de esta interfaz de red
•boolean isLoopback() devuelve si esta interfaz de red es una interfaz loopback
•boolean isPointToPoint() devuelve si esta interfaz de red es una interfaz punto a punto
•boolean isUp() devuelve si esta interfaz de red está activa y ejecutándose
•boolean isVirtual() devuelve si esta interfaz es una interfaz virtual