Если бы я собирался реализовать это на Java, я бы выбрал какой-нибудь неиспользуемый номер порта TCP / IP, а затем попытался открыть сокет для каждого IP-адреса в диапазоне (-ах) IP-адреса локальной сети. Вы ожидаете, что все попытки соединения потерпят неудачу, но они должны потерпеть неудачу различными способами в зависимости от того, использует ли машина IP-адрес. Если используется IP-адрес, вы должны получить «отказано в соединении». Если он не используется, вы должны получить «нет маршрута к хосту» или «нет маршрута к сети». «Тайм-аут соединения» может указывать на то, что хост имеет огненную стену или недавно был жив, но в данный момент не жив.
Другой подход (который я не знаю, вы можете сделать из Java) - это отправлять запросы ARP для каждого из IP-адресов в диапазоне сетевых адресов и смотреть, что происходит в ARP-кэше вашей машины.
И, конечно, вы можете попробовать отправить сообщения ICMP Ping, но они могут быть защищены брандмауэром.
Получив список действующих IP-адресов, воспользуйтесь обратным поиском DNS, чтобы найти соответствующие имена DNS. Но учтите, что не все IP-адреса связаны с DNS-именами.
Однако все это немного ненадежно, учитывая, что многие машины и сети используют брандмауэры различного типа, и они обычно отбрасывают сетевые сообщения или отправляют ложные ответы.