Oft müssen wir Server-Hardwareinformationen (z. B. MAC-Adresse) abrufen. Es gibt mehrere häufig verwendete Methoden:
•Verwenden Sie das Befehlszeilenprogramm, um die Festplatteninformationen abzurufen, rufen Sie dann den Ausgabestream über Runtime.getRuntime().exec ab und ermitteln Sie dann die MAC-Adresse über die Zeichenfolgenanalyse
•Kompilieren Sie das lokale Programm und rufen Sie es dann über JNI auf
Bei beiden oben genannten Methoden müssen verschiedene Betriebssystemplattformen unterschieden und separat codiert werden, was problematischer ist, z
• Die Windows-Plattform muss den Befehl iptables /all verwenden
•Linux-Plattform muss den Befehl ifconfig verwenden
Heute werde ich eine gängige plattformübergreifende Betriebsmethode vorstellen, nämlich die mit JDK gelieferte NetworkInterface-Schnittstelle. Diese Schnittstelle ist in JDK1.4 enthalten, verfügt jedoch über relativ wenige neue Funktionen ist ganz gut.
Informationen zu bestimmten Funktionen finden Sie in der API-Dokumentation. Hier stellen wir hauptsächlich vor, wie Sie die Server-MAC-Adresse erhalten. Der Code lautet wie folgt, daher werde ich nicht auf Details eingehen.
Kopieren Sie den Codecode wie folgt:
// MAC-Adressen aller Netzwerkkarten abrufen
öffentliche statische Liste<String> getAllMac() {
List<String> list = new ArrayList<String>();
versuchen {
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); // Gibt eine Enumerationsinstanz aller Netzwerkschnittstellen zurück
while (e.hasMoreElements()) {
NetworkInterface network = e.nextElement();//Holen Sie sich die aktuelle Netzwerkschnittstelle
if (Netzwerk != null) {
if (network.getHardwareAddress() != null) {
// MAC-Adresse abrufen
// Das Ergebnis ist ein Byte-Array, jedes Element ist ein Byte, wir müssen es über die parseByte-Methode in eine gemeinsame hexadezimale Darstellung konvertieren
byte[] addres = network.getHardwareAddress();
StringBuffer sb = new StringBuffer();
if (Adressen != null && Adressenlänge > 1) {
sb.append(parseByte(adressen[0])).append(":").append(
parseByte(adressen[1])).append(":").append(
parseByte(adressen[2])).append(":").append(
parseByte(adressen[3])).append(":").append(
parseByte(adressen[4])).append(":").append(
parseByte(adressen[5]));
list.add(sb.toString());
}
}
} anders {
System.out.println("Beim Abrufen der MAC-Adresse ist eine Ausnahme aufgetreten");
}
}
} Catch (SocketException e) {
e.printStackTrace();
}
Rückgabeliste;
}
//Binär formatieren
privater statischer String parseByte(byte b) {
int intValue = 0;
if (b >= 0) {
intValue = b;
} anders {
intValue = 256 + b;
}
return Integer.toHexString(intValue);
}
Anschließend verwenden wir den folgenden Testcode, um die Testergebnisse anzuzeigen
Kopieren Sie den Codecode wie folgt:
List<String> list = getAllMac();
for (String mac : list) {
System.out.println(mac);
}
Die Ausgabe ist wie folgt:
Kopieren Sie den Codecode wie folgt:
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
Jeder hat festgestellt, dass „0:18:8b:cc:xx:e3“ nur eine 0 hat, was sehr umständlich aussieht. Wir könnten die parseByte-Methode genauso gut wie folgt überarbeiten:
Kopieren Sie den Codecode wie folgt:
privater statischer String parseByte(byte b) {
String s = "00"+Integer.toHexString(byte0);
return s.substring(s.length() - 2);
}
Die Ausgabeergebnisse ändern sich:
Kopieren Sie den Codecode wie folgt:
00:18:8b:cc:xx:e3
00:00:00:00:00:e0
00:50:xx:c0:00:01
00:50:xx:c0:00:08
So sieht es doch bequemer aus, oder?
Darüber hinaus bietet die NetworkInterface-Schnittstelle auch die folgenden Methoden, auf die Sie verweisen können.
•String displayName() Ruft den Anzeigenamen der Netzwerkschnittstelle ab
•int getMTU() gibt die Maximum Transmission Unit (MTU) dieser Schnittstelle zurück
•String getName() ruft den Namen dieser Netzwerkschnittstelle ab
•boolean isLoopback() gibt zurück, ob diese Netzwerkschnittstelle eine Loopback-Schnittstelle ist
•boolean isPointToPoint() gibt zurück, ob diese Netzwerkschnittstelle eine Punkt-zu-Punkt-Schnittstelle ist
•boolean isUp() gibt zurück, ob diese Netzwerkschnittstelle aktiv ist und läuft
•boolean isVirtual() gibt zurück, ob diese Schnittstelle eine virtuelle Schnittstelle ist