Часто нам необходимо получить информацию об оборудовании сервера (например, 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 = новый ArrayList<String>();
пытаться {
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces() // Возвращает экземпляр перечисления всех сетевых интерфейсов.
в то время как (e.hasMoreElements()) {
NetworkInterface network = e.nextElement();//Получить текущий сетевой интерфейс
если (сеть!= ноль) {
if (network.getHardwareAddress() != null) {
// Получаем MAC-адрес
//Результат — массив байтов, каждый элемент — это байт, нам нужно преобразовать его в общее шестнадцатеричное представление с помощью метода parseByte
byte[] адрес = network.getHardwareAddress();
StringBuffer sb = новый StringBuffer();
if (адрес != null && адрес.длина > 1) {
sb.append(parseByte(адрес[0])).append(":").append(
parseByte(адрес[1])).append(":").append(
parseByte(адрес[2])).append(":").append(
parseByte(адрес[3])).append(":").append(
parseByte(адрес[4])).append(":").append(
parseByte(адрес[5]));
list.add(sb.toString());
}
}
} еще {
System.out.println("Произошло исключение при получении MAC-адреса");
}
}
} catch (SocketException e) {
е.printStackTrace();
}
список возврата;
}
//Форматируем двоичный файл
частная статическая строка parseByte (байт b) {
интервал intValue = 0;
если (б >= 0) {
intValue = б;
} еще {
intValue = 256 + б;
}
return Integer.toHexString(intValue);
}
Затем мы используем следующий тестовый код, чтобы увидеть результаты теста.
Скопируйте код кода следующим образом:
List<String> list = getAllMac();
for (Строка mac: список) {
System.out.println(mac);
}
Вывод следующий:
Скопируйте код кода следующим образом:
0:18:8b:cc:xx:e3
0:0:0:0:0:0:0:e0
0:50:хх:с0:0:1
0:50:хх:с0:0:8
Все обнаружили, что «0:18:8b:cc:xx:e3» имеет только один 0, что выглядит очень неудобно. С таким же успехом мы могли бы пересмотреть метод parseByte следующим образом:
Скопируйте код кода следующим образом:
частная статическая строка parseByte (байт b) {
String s = "00"+Integer.toHexString(byte0);
вернуть s.substring(s.length() - 2);
}
Выходные результаты меняются:
Скопируйте код кода следующим образом:
00:18:8b:cc:xx:e3
00:00:00:00:00:e0
00:50:хх:с0:00:01
00:50:хх:с0:00:08
Так удобнее, правда?
Кроме того, интерфейс NetworkInterface также предоставляет следующие методы, к которым вы можете обратиться.
•String displayName() Получает отображаемое имя сетевого интерфейса.
•int getMTU() возвращает максимальную единицу передачи (MTU) этого интерфейса.
•String getName() получает имя этого сетевого интерфейса.
•boolean isLoopback() возвращает, является ли этот сетевой интерфейс интерфейсом обратной связи.
•boolean isPointToPoint() возвращает, является ли этот сетевой интерфейс интерфейсом «точка-точка».
•boolean isUp() возвращает, запущен ли этот сетевой интерфейс и работает ли он
•boolean isVirtual() возвращает, является ли этот интерфейс виртуальным интерфейсом.