نحتاج في كثير من الأحيان إلى الحصول على معلومات أجهزة الخادم (مثل عنوان MAC). هناك عدة طرق شائعة الاستخدام:
• استخدم برنامج سطر الأوامر للحصول على معلومات القرص الصلب، ثم احصل على دفق الإخراج من خلال Runtime.getRuntime().exec، ثم احصل على عنوان MAC من خلال تحليل السلسلة
• ترجمة البرنامج المحلي ومن ثم الاتصال به من خلال JNI
تتطلب كلتا الطريقتين المذكورتين أعلاه التمييز بين منصات أنظمة التشغيل المختلفة وترميزها بشكل منفصل، وهو أمر أكثر إزعاجًا، مثل
• يحتاج نظام Windows الأساسي إلى استخدام الأمر iptables /all
• يحتاج نظام Linux إلى استخدام أمر ifconfig
سأقدم اليوم طريقة تشغيل مشتركة عبر الأنظمة الأساسية، وهي واجهة NetworkInterface التي تأتي مع JDK. ظهرت هذه الواجهة في JDK1.4، ولكنها تحتوي على وظائف قليلة نسبيًا بعد JDK1.6، والتي جيد جدًا.
يمكنك الرجوع إلى وثائق واجهة برمجة التطبيقات (API) للحصول على وظائف محددة. نقدم هنا بشكل أساسي كيفية الحصول على عنوان MAC للخادم، كما يلي، مع التعليقات، لذلك لن أخوض في التفاصيل.
انسخ رمز الكود كما يلي:
// احصل على عناوين MAC لجميع بطاقات الشبكة
قائمة ثابتة عامة <String> getAllMac() {
List<String> list = new ArrayList<String>();
يحاول {
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); // إرجاع مثيل التعداد لجميع واجهات الشبكة
بينما (e.hasMoreElements()) {
NetworkInterface Network = e.nextElement();// احصل على واجهة الشبكة الحالية
إذا (الشبكة!= فارغة) {
إذا (network.getHardwareAddress() != null) {
// احصل على عنوان MAC
// النتيجة هي مصفوفة بايت، كل عنصر عبارة عن بايت، نحتاج إلى تحويله إلى تمثيل سداسي عشري شائع من خلال طريقة parseByte
byte[] addres =network.getHardwareAddress();
StringBuffer sb = new StringBuffer();
إذا (العناوين != فارغة && addres.length > 1) {
sb.append(parseByte(addres[0])).append(":":).append(
parseByte(addres[1])).append(":":).append(
parseByte(addres[2])).append(":":).append(
parseByte(addres[3])).append(":":).append(
parseByte(addres[4])).append(":":).append(
parseByte(address[5]));
list.add(sb.toString());
}
}
} آخر {
System.out.println("حدث استثناء أثناء الحصول على عنوان MAC");
}
}
} قبض على (SocketException ه) {
printStackTrace();
}
قائمة العودة؛
}
// تنسيق ثنائي
سلسلة ثابتة خاصة parseByte (بايت ب) {
كثافة العمليات intValue = 0;
إذا (ب >= 0) {
intValue = b;
} آخر {
intValue = 256 + ب;
}
إرجاع Integer.toHexString(intValue);
}
ثم نستخدم رمز الاختبار التالي لرؤية نتائج الاختبار
انسخ رمز الكود كما يلي:
List<String> list = getAllMac();
لـ (سلسلة ماك: قائمة) {
System.out.println(mac);
}
الإخراج هو كما يلي:
انسخ رمز الكود كما يلي:
0:18:8ب:cc: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 (بايت ب) {
String s = "00"+Integer.toHexString(byte0);
إرجاع s.substring(s.length() - 2);
}
تتغير نتائج الإخراج:
انسخ رمز الكود كما يلي:
00:18:8ب:cc: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() تقوم بإرجاع الحد الأقصى لوحدة الإرسال (MTU) لهذه الواجهة
• تحصل String getName() على اسم واجهة الشبكة هذه
•boolean isLoopback() يُرجع ما إذا كانت واجهة الشبكة هذه عبارة عن واجهة استرجاع
•boolean isPointToPoint() يُرجع ما إذا كانت واجهة الشبكة هذه هي واجهة نقطة إلى نقطة
يقوم •boolean isUp() بإرجاع ما إذا كانت واجهة الشبكة هذه قيد التشغيل أم لا
•boolean isVirtual() يُرجع ما إذا كانت هذه الواجهة واجهة افتراضية