Определите, какой 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;
}

Как видите, я просто перебираю сетевые интерфейсы и проверяю каждый из них, чтобы убедиться, что локальный хост привязан к нему. До сих пор у меня не было никаких проблем с этим методом.

Другие вопросы по тегам