Muitas vezes, precisamos obter informações de hardware do servidor (como endereço MAC). Existem vários métodos comumente usados:
• Use o programa de linha de comando para obter as informações do disco rígido, em seguida, obtenha o fluxo de saída por meio de Runtime.getRuntime().exec e, em seguida, obtenha o endereço MAC por meio de análise de string
• Compilar o programa local e depois chamá-lo através do JNI
Ambos os métodos acima exigem distinguir diferentes plataformas de sistema operacional e codificá-las separadamente, o que é mais problemático, como
• A plataforma Windows precisa usar o comando iptables /all
•A plataforma Linux precisa usar o comando ifconfig
Hoje apresentarei um método comum de operação entre plataformas, que é a interface NetworkInterface que vem com o JDK. Essa interface apareceu no JDK1.4, mas tem relativamente poucas funções. Após o JDK1.6, muitas novas funções foram adicionadas. é muito bom.
Você pode consultar a documentação da API para funções específicas. Aqui apresentamos principalmente como obter o endereço MAC do servidor. O código é o seguinte, com comentários, então não entrarei em detalhes.
Copie o código do código da seguinte forma:
//Obtém os endereços MAC de todas as placas de rede
public static List<String> getAllMac() {
Lista<String> lista = new ArrayList<String>();
tentar {
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); // Retorna uma instância de enumeração de todas as interfaces de rede;
enquanto (e.hasMoreElements()) {
NetworkInterface network = e.nextElement();//Obtém a interface de rede atual
if (rede! = nulo) {
if (network.getHardwareAddress()! = nulo) {
//Obtém o endereço MAC
//O resultado é um array de bytes, cada item é um byte, precisamos convertê-lo em uma representação hexadecimal comum através do método parseByte
byte[] endereço = network.getHardwareAddress();
StringBuffer sb = new StringBuffer();
if (endereço! = null && endereço.length > 1) {
sb.append(parseByte(endereço[0])).append(":").append(
parseByte(endereço[1])).append(":").append(
parseByte(endereço[2])).append(":").append(
parseByte(endereço[3])).append(":").append(
parseByte(endereço[4])).append(":").append(
parseByte(endereço[5]));
list.add(sb.toString());
}
}
} outro {
System.out.println("Ocorreu uma exceção ao obter o endereço MAC");
}
}
} catch (SocketException e) {
e.printStackTrace();
}
lista de retorno;
}
//Formatar binário
String estática privada parseByte(byte b) {
int intValor = 0;
se (b >= 0) {
intValor = b;
} outro {
intValor = 256 + b;
}
retornar Integer.toHexString(intValue);
}
Em seguida, usamos o seguinte código de teste para ver os resultados do teste
Copie o código do código da seguinte forma:
List<String> list = getAllMac();
for (String mac: lista) {
System.out.println(mac);
}
A saída é a seguinte:
Copie o código do código da seguinte forma:
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 descobriram que "0:18:8b:cc:xx:e3" tem apenas um 0, o que parece muito estranho. Poderíamos também revisar o método parseByte da seguinte forma:
Copie o código do código da seguinte forma:
String estática privada parseByte(byte b) {
String s = "00"+Integer.toHexString(byte0);
return s.substring(s.length() - 2);
}
Os resultados de saída mudam:
Copie o código do código da seguinte forma:
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 mais confortável assim, certo?
Além disso, a interface NetworkInterface também fornece os métodos a seguir, aos quais você pode consultar.
•String displayName() Obtém o nome de exibição da interface de rede
•int getMTU() retorna a Unidade Máxima de Transmissão (MTU) desta interface
•String getName() obtém o nome desta interface de rede
•boolean isLoopback() retorna se esta interface de rede é uma interface de loopback
•boolean isPointToPoint() retorna se esta interface de rede é uma interface ponto a ponto
•boolean isUp() retorna se esta interface de rede está instalada e funcionando
•boolean isVirtual() retorna se esta interface é uma interface virtual