หลายครั้ง เราจำเป็นต้องได้รับข้อมูลฮาร์ดแวร์ของเซิร์ฟเวอร์ (เช่น ที่อยู่ MAC) มีหลายวิธีที่ใช้กันทั่วไป:
•ใช้โปรแกรมบรรทัดคำสั่งเพื่อรับข้อมูลฮาร์ดดิสก์ จากนั้นรับสตรีมเอาต์พุตผ่าน Runtime.getRuntime().exec จากนั้นรับที่อยู่ MAC ผ่านการวิเคราะห์สตริง
•คอมไพล์โปรแกรมโลคัลแล้วเรียกใช้ผ่าน JNI
ทั้งสองวิธีข้างต้นจำเป็นต้องแยกแยะแพลตฟอร์มระบบปฏิบัติการที่แตกต่างกันและเข้ารหัสแยกกัน ซึ่งยุ่งยากกว่า เช่น
• แพลตฟอร์ม Windows จำเป็นต้องใช้คำสั่ง iptables /all
•แพลตฟอร์ม Linux จำเป็นต้องใช้คำสั่ง ifconfig
วันนี้ผมจะมาแนะนำวิธีการใช้งานข้ามแพลตฟอร์มทั่วไป ซึ่งเป็นอินเทอร์เฟซ NetworkInterface ที่มาพร้อมกับ JDK อินเทอร์เฟซนี้ปรากฏใน JDK1.4 แต่มีฟังก์ชันค่อนข้างน้อย หลังจาก JDK1.6 มีการเพิ่มฟังก์ชันใหม่ ๆ มากมาย ค่อนข้างดี
คุณสามารถดูเอกสารประกอบ API สำหรับฟังก์ชันเฉพาะได้ ในที่นี้ เราจะแนะนำวิธีการรับที่อยู่ MAC ของเซิร์ฟเวอร์เป็นหลัก โดยมีโค้ดดังนี้ พร้อมความคิดเห็น ดังนั้นฉันจะไม่ลงรายละเอียด
คัดลอกรหัสรหัส ดังต่อไปนี้:
//รับที่อยู่ MAC ของการ์ดเครือข่ายทั้งหมด
รายการคงที่สาธารณะ <String> getAllMac() {
รายการ <String> รายการ = ArrayList ใหม่ <String>();
พยายาม {
การแจงนับ<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); // ส่งคืนอินสแตนซ์การแจงนับของอินเทอร์เฟซเครือข่ายทั้งหมด
ในขณะที่ (e.hasMoreElements()) {
NetworkInterface network = e.nextElement();//รับอินเทอร์เฟซเครือข่ายปัจจุบัน
ถ้า (เครือข่าย != null) {
ถ้า (network.getHardwareAddress() != null) {
// รับที่อยู่ MAC
//ผลลัพธ์ที่ได้คืออาร์เรย์ไบต์ แต่ละรายการเป็นไบต์ เราจำเป็นต้องแปลงมันให้เป็นเลขฐานสิบหกทั่วไปโดยใช้วิธี parseByte
ไบต์ [] ที่อยู่ = network.getHardwareAddress ();
StringBuffer sb = StringBuffer ใหม่ ();
ถ้า (ที่อยู่ != null && addres.length > 1) {
sb.append(parseByte(addres[0])).append(///).append(
parseByte(ที่อยู่[1])).ผนวก(///).ผนวก(
parseByte(ที่อยู่[2])).ผนวก(///).ผนวก(
parseByte(ที่อยู่[3])).ผนวก(///).ผนวก(
parseByte(ที่อยู่[4])).ผนวก(///).ผนวก(
parseByte (ที่อยู่ [5]));
list.add(sb.toString());
-
-
} อื่น {
System.out.println("เกิดข้อยกเว้นขณะรับที่อยู่ MAC");
-
-
} จับ (SocketException จ) {
e.printStackTrace();
-
รายการส่งคืน;
-
//จัดรูปแบบไบนารี่
สตริงส่วนตัวแบบคงที่ parseByte (ไบต์ b) {
int ค่า int = 0;
ถ้า (ข >= 0) {
intValue = ข;
} อื่น {
ค่า intValue = 256 + b;
-
กลับ Integer.toHexString (intValue);
-
จากนั้นเราใช้โค้ดทดสอบต่อไปนี้เพื่อดูผลการทดสอบ
คัดลอกรหัสรหัส ดังต่อไปนี้:
รายการ <สตริง> รายการ = getAllMac();
สำหรับ (String mac : รายการ) {
System.out.println(แมค);
-
ผลลัพธ์จะเป็นดังนี้:
คัดลอกรหัสรหัส ดังต่อไปนี้:
0:18:8b:ซีซี:xx:e3
0:0:0:0:0:0:0:e0
0:50:xx:c0:0:1
0:50:xx:c0:0:8
ทุกคนพบว่า "0:18:8b:cc:xx:e3" มีเพียง 0 เดียว ซึ่งดูน่าอึดอัดใจมาก เราอาจแก้ไขวิธี parseByte ดังต่อไปนี้:
คัดลอกรหัสรหัส ดังต่อไปนี้:
สตริงส่วนตัวแบบคงที่ parseByte (ไบต์ b) {
สตริง s = "00"+จำนวนเต็มtoHexString(byte0);
กลับ s.substring(s.length() - 2);
-
ผลลัพธ์ผลลัพธ์จะเปลี่ยนไป:
คัดลอกรหัสรหัส ดังต่อไปนี้:
00:18:8b:ซีซี:xx:e3
00:00:00:00:00:e0
00:50:xx:c0:00:01
00:50:xx:c0:00:08
วิธีนี้ดูสบายกว่าใช่ไหม?
นอกจากนี้ อินเทอร์เฟซ NetworkInterface ยังมีวิธีการต่อไปนี้ ซึ่งคุณสามารถอ้างอิงได้
•String displayName() รับชื่อที่แสดงของอินเทอร์เฟซเครือข่าย
•int getMTU() ส่งคืน Maximum Transmission Unit (MTU) ของอินเทอร์เฟซนี้
•String getName() รับชื่อของอินเทอร์เฟซเครือข่ายนี้
•boolean isLoopback() คืนค่าว่าอินเทอร์เฟซเครือข่ายนี้เป็นอินเทอร์เฟซแบบย้อนกลับหรือไม่
•boolean isPointToPoint() ส่งคืนว่าอินเทอร์เฟซเครือข่ายนี้เป็นอินเทอร์เฟซแบบจุดต่อจุดหรือไม่
•boolean isUp() ส่งคืนว่าอินเทอร์เฟซเครือข่ายนี้เปิดใช้งานและทำงานอยู่หรือไม่
•boolean isVirtual() คืนค่าว่าอินเทอร์เฟซนี้เป็นอินเทอร์เฟซเสมือนหรือไม่