Проблема с isReachable в классе InetAddress - PullRequest
10 голосов
/ 24 января 2011

В качестве задания я должен найти все живые компьютеры в локальной сети.Для чего я использую функцию isReachable класса InetAddress.Но проблема в том, что мне ничего не показано.Поэтому я попытался получить isReachable с IP-адресом Google, но все равно это недоступно.

Вот код:

import java.net.*;

public class alive{
    public static void main(String args[]){
        try{
            InetAddress ia = InetAddress.getByAddress(new byte[]{(byte)209, (byte)85, (byte)153, (byte)104});
            boolean b = ia.isReachable(10000);
            if(b){
                System.out.println("Reachable");
            }
            else{
                System.out.println("Unrachable");
            }

        }catch(Exception e){
            System.out.println("Exception: " + e.getMessage());
        }
    }
}

Вывод: Unreachable

Ответы [ 3 ]

5 голосов
/ 24 января 2011

Вот некоторые подробности о том, почему isReachable () не всегда работает должным образом.

  1. http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html
  2. http://www.coderanch.com/t/206934/sockets/java/InetAdress-isReachable-Ping-Permissions

Правильный способ для вас - использовать протокол ICMP . Это то, что ping использует на международном уровне, я считаю. Вот пример , с которого можно начать.

3 голосов
/ 11 декабря 2015

Вот код, который не зависит от платформы, но требует информации о любом открытом порту на другом компьютере (который у нас есть большую часть времени).

private static boolean isReachable(String addr, int openPort, int timeOutMillis) {
    // Any Open port on other machine
    // openPort =  22 - ssh, 80 or 443 - webserver, 25 - mailserver etc.
    try {
        try (Socket soc = new Socket()) {
            soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
        }
        return true;
    } catch (IOException ex) {
        return false;
    }
}
2 голосов
/ 03 июля 2015

Я нашел интересное решение.Если вы не можете запустить приложение от имени пользователя root, вы можете установить необработанный сокет для java:

sudo setcap cap_net_raw=ep /usr/lib/jvm/jdk/bin/java

И тогда будет использоваться протокол ICMP вместо запроса эха на 7 TCP-порте.

...