. Java не предоставляет прямого способа запросить MAC-адрес хост в вашей сети, поскольку он абстрагируется библиотеками сокетов Java.
В некотором смысле это имеет смысл, потому что MAC-адрес хоста на самом деле говорит очень мало. Не существует такого понятия, как «MAC-адрес хоста».
Сложите обе эти проблемы вместе, и это означает, что один хост может иметь много разных MAC-адресов (если у него более одной сетевой карты), а один MAC-адрес может представлять множество разных хостов (если трафик проходит через маршрутизатор).
Предполагая, что вы все это знаете и вам все еще нужно получить MAC-адрес хоста, единственный способ сделать это в Java - "перейти на собственный":
system_profile
. system_profile
. ARP - это способ сопоставления IP-адресов с MAC-адресами. Вот как это делает стек IP.
Я не уверен, что существует переносимый способ получить эту информацию, поскольку он обычно важен только для разработчиков ядра и системных администраторов.
Из-за большого количества поисков в Интернете кажется, что можно получить таблица ARP маршрутизатора с использованием SNMP, но я не нашел много конкретной информации о том, как это сделать. Я нашел бесплатную библиотеку Java для SNMP здесь . Некоторое изучение там может оказаться продуктивным.
Вы можете получить свой собственный MAC-адрес через:
Enumeration<NetworkInterface> it = NetworkInterface.getNetworkInterfaces();
while ( it.hasMoreElements() ) {
byte[] macAddress = it.nextElement().getHardwareAddress();
}
Определенно нет способа получить MAC-адрес другого хоста с помощью vanilla java. Для этого вам придется использовать выполнение процесса или собственную библиотеку.
Если вы управляете другими машинами, вы можете позволить им запрашивать свой собственный MAC и отправлять его обратно по каналу TCP / IP, но я предполагаю это не то, что вы хотите. Для получения дополнительных сведений см. Ответ jqno.
Кэш arp является стандартным в наборе доступных данных SNMP. Вы можете использовать SNMP4J , чтобы написать тривиальный агент для запроса этих данных.
например, из набора инструментов SNMP
snmpwalk ${hostname} 1.3.6.1.2.1.4.22.1.2
командной строки (эта огромная строка, разделенная точками, является OID или идентификатором ARP кэш в терминах SNMP. Это будет работать для всех реализаций SNMP)
Возможно, эта проблема не решается в контексте Java (поскольку она не зависит от платформы), но вы также должны подумать, можете ли вы получить MAC-адреса через системную службу. Вероятно, существуют ситуации, когда вы не можете надежно найти MAC-адрес через ARP, это зависит от того, зачем вам нужен MAC-адрес.