Определите, какой NetworkInterface используется в настоящее время
Я пытаюсь выяснить, какой сетевой интерфейс в настоящее время используется на локальной машине. я могу использовать NetworkInterface.getNetworkInterfaces()
чтобы установить все интерфейсы на моем компьютере, но я не могу определить, какой интерфейс использует компьютер для доступа в Интернет.
Я попытался отфильтровать неактивные и петлевые интерфейсы, а затем распечатать остальные:
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface face = interfaces.nextElement();
if (face.isLoopback() || !face.isUp()) {
continue;
}
System.out.println(face.getDisplayName());
}
Результаты ниже:
Qualcomm Atheros AR9485 802.11b/g/n WiFi Adapter
Microsoft ISATAP Adapter #5
Как видите, в списке есть два интерфейса. Мой компьютер в настоящее время использует для подключения к Интернету адаптер Qualcomm Atheros. Я мог бы просто проверить имя интерфейса, чтобы увидеть, был ли это адаптер Qualcomm, но это будет работать, пока я не использовал другой адаптер Qualcomm для установления соединения Ethernet.
Я видел аналогичный вопрос о Superuser, который определял маршрут на основе метрики.
Есть ли чистый способ сделать это в Java?
1 ответ
Я нашел отличный способ сделать это:
public static NetworkInterface getCurrentInterface() throws SocketException, UnknownHostException {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
InetAddress myAddr = InetAddress.getLocalHost();
while (interfaces.hasMoreElements()) {
NetworkInterface face = interfaces.nextElement();
if (Collections.list(face.getInetAddresses()).contains(myAddr))
return face;
}
return null;
}
Как видите, я просто перебираю сетевые интерфейсы и проверяю каждый из них, чтобы убедиться, что локальный хост привязан к нему. До сих пор у меня не было никаких проблем с этим методом.