Seringkali, kita perlu mendapatkan informasi perangkat keras server (seperti alamat MAC). Ada beberapa metode yang umum digunakan:
•Gunakan program baris perintah untuk memperoleh informasi hard disk, kemudian memperoleh aliran keluaran melalui Runtime.getRuntime().exec, dan kemudian memperoleh alamat MAC melalui analisis string
•Kompilasi program lokal lalu panggil melalui JNI
Kedua metode di atas memerlukan pembedaan platform sistem operasi yang berbeda dan pengkodeannya secara terpisah, yang lebih merepotkan, misalnya
• Platform Windows perlu menggunakan perintah iptables /all
•Platform Linux perlu menggunakan perintah ifconfig
Hari ini saya akan memperkenalkan metode operasi lintas platform yang umum, yaitu antarmuka NetworkInterface yang disertakan dengan JDK. Antarmuka ini telah muncul di JDK1.4, tetapi memiliki fungsi yang relatif sedikit setelah JDK1.6, banyak fungsi baru yang ditambahkan cukup bagus.
Anda dapat merujuk ke dokumentasi API untuk fungsi tertentu. Di sini kami terutama memperkenalkan cara mendapatkan alamat MAC server. Kodenya adalah sebagai berikut, dengan komentar, jadi saya tidak akan menjelaskan secara detail.
Copy kode kodenya sebagai berikut:
//Dapatkan alamat MAC semua kartu jaringan
Daftar statis publik<String> getAllMac() {
Daftar<String> daftar = Daftar Array baru<String>();
mencoba {
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); // Mengembalikan instance enumerasi semua antarmuka jaringan
while (e.hasMoreElements()) {
NetworkInterface network = e.nextElement();//Dapatkan antarmuka jaringan saat ini
if (jaringan != null) {
jika (jaringan.getHardwareAddress() != null) {
// Dapatkan alamat MAC
//Hasilnya adalah array byte, setiap item adalah byte, kita perlu mengubahnya menjadi representasi heksadesimal umum melalui metode parseByte
byte[] alamat = jaringan.getHardwareAddress();
StringBuffer sb = StringBuffer baru();
if (alamat != null && alamat.panjang > 1) {
sb.append(parseByte(alamat[0])).append(":").append(
parseByte(alamat[1])).append(":").append(
parseByte(alamat[2])).append(":").append(
parseByte(alamat[3])).append(":").append(
parseByte(alamat[4])).append(":").append(
parseByte(alamat[5]));
daftar.tambahkan(sb.toString());
}
}
} kalau tidak {
System.out.println("Terjadi pengecualian saat mendapatkan alamat MAC");
}
}
} tangkapan (SocketException e) {
e.printStackTrace();
}
daftar pengembalian;
}
//Format biner
String statis pribadi parseByte(byte b) {
int nilai int = 0;
jika (b >= 0) {
intNilai = b;
} kalau tidak {
intNilai = 256 + b;
}
return Integer.toHexString(intValue);
}
Kemudian kita gunakan kode pengujian berikut untuk melihat hasil pengujiannya
Copy kode kodenya sebagai berikut:
Daftar<String> daftar = getAllMac();
untuk (String mac : daftar) {
Sistem.keluar.println(mac);
}
Outputnya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
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
Semua orang menemukan bahwa "0:18:8b:cc:xx:e3" hanya memiliki satu 0, yang terlihat sangat aneh. Sebaiknya kita merevisi metode parseByte sebagai berikut:
Copy kode kodenya sebagai berikut:
String statis pribadi parseByte(byte b) {
String s = "00"+Integer.toHexString(byte0);
return s.substring(s.panjang() - 2);
}
Hasil keluarannya berubah:
Copy kode kodenya sebagai berikut:
00:18:8b:cc:xx:e3
00:00:00:00:00:e0
00:50:xx:c0:00:01
00:50:xx:c0:00:08
Terlihat lebih nyaman seperti ini, bukan?
Selain itu, antarmuka NetworkInterface juga menyediakan metode berikut, yang dapat Anda rujuk.
•String displayName() Mendapatkan nama tampilan antarmuka jaringan
•int getMTU() mengembalikan Unit Transmisi Maksimum (MTU) antarmuka ini
•String getName() mendapatkan nama antarmuka jaringan ini
•boolean isLoopback() mengembalikan apakah antarmuka jaringan ini merupakan antarmuka loopback
•boolean isPointToPoint() mengembalikan apakah antarmuka jaringan ini merupakan antarmuka point-to-point
•boolean isUp() mengembalikan apakah antarmuka jaringan ini aktif dan berjalan
•boolean isVirtual() mengembalikan apakah antarmuka ini merupakan antarmuka virtual