Plusieurs fois, nous devons obtenir des informations sur le matériel du serveur (telles que l'adresse MAC). Il existe plusieurs méthodes couramment utilisées :
•Utilisez le programme de ligne de commande pour obtenir les informations sur le disque dur, puis obtenez le flux de sortie via Runtime.getRuntime().exec, puis obtenez l'adresse MAC via l'analyse de chaîne.
• Compilez le programme local, puis appelez-le via JNI.
Les deux méthodes ci-dessus nécessitent de distinguer différentes plates-formes de système d'exploitation et de les coder séparément, ce qui est plus gênant, comme
• La plate-forme Windows doit utiliser la commande iptables /all
• La plate-forme Linux doit utiliser la commande ifconfig
Aujourd'hui, je vais présenter une méthode de fonctionnement multiplateforme commune, qui est l'interface NetworkInterface fournie avec JDK. Cette interface est apparue dans JDK1.4, mais a relativement peu de fonctions. Après JDK1.6, de nombreuses nouvelles fonctions ont été ajoutées. c'est plutôt bien.
Vous pouvez vous référer à la documentation de l'API pour des fonctions spécifiques. Ici, nous présentons principalement comment obtenir l'adresse MAC du serveur. Le code est le suivant, avec des commentaires, je n'entrerai donc pas dans les détails.
Copiez le code comme suit :
//Obtenir les adresses MAC de toutes les cartes réseau
public static List<String> getAllMac() {
List<String> list = new ArrayList<String>();
essayer {
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); // Renvoie une instance d'énumération de toutes les interfaces réseau
while (e.hasMoreElements()) {
NetworkInterface network = e.nextElement();//Obtenir l'interface réseau actuelle
si (réseau != null) {
if (network.getHardwareAddress() != null) {
// Récupère l'adresse MAC
//Le résultat est un tableau d'octets, chaque élément est un octet, nous devons le convertir en une représentation hexadécimale commune via la méthode parseByte
byte[] addres = network.getHardwareAddress();
StringBuffer sb = new StringBuffer();
if (adresses != null && adresses.longueur > 1) {
sb.append(parseByte(addres[0])).append(":").append(
parseByte(adresse[1])).append(":").append(
parseByte(adresse[2])).append(":").append(
parseByte(adresse[3])).append(":").append(
parseByte(adresse[4])).append(":").append(
parseByte(adresses[5]));
list.add(sb.toString());
}
}
} autre {
System.out.println("Une exception s'est produite lors de l'obtention de l'adresse MAC");
}
}
} catch (SocketException e) {
e.printStackTrace();
}
liste de retour ;
}
//Formater le binaire
chaîne statique privée parseByte (octet b) {
int valeurint = 0 ;
si (b >= 0) {
valeurint = b;
} autre {
valeurint = 256 + b ;
}
return Integer.toHexString(intValue);
}
Ensuite, nous utilisons le code de test suivant pour voir les résultats du test
Copiez le code comme suit :
List<String> list = getAllMac();
pour (String mac : liste) {
System.out.println(mac);
}
Le résultat est le suivant :
Copiez le code comme suit :
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
Tout le monde a trouvé que "0:18:8b:cc:xx:e3" n'avait qu'un seul 0, ce qui semble très gênant. Autant réviser la méthode parseByte comme suit :
Copiez le code comme suit :
chaîne statique privée parseByte (octet b) {
Chaîne s = "00"+Integer.toHexString(byte0);
return s.substring(s.length() - 2);
}
Les résultats de sortie changent :
Copiez le code comme suit :
00:18:8b:cc:xx:e3
00:00:00:00:00:e0
00:50:xx:c0:00:01
00:50:xx:c0:00:08
Cela semble plus confortable de cette façon, non ?
De plus, l'interface NetworkInterface fournit également les méthodes suivantes, auxquelles vous pouvez vous référer.
•String displayName() Obtient le nom d'affichage de l'interface réseau
•int getMTU() renvoie l'unité de transmission maximale (MTU) de cette interface
•String getName() récupère le nom de cette interface réseau
•boolean isLoopback() renvoie si cette interface réseau est une interface de bouclage
•boolean isPointToPoint() renvoie si cette interface réseau est une interface point à point
•boolean isUp() renvoie si cette interface réseau est opérationnelle
•boolean isVirtual() renvoie si cette interface est une interface virtuelle