2012-03-04 9 views
8

Sto cercando di scoprire se determinati host sulla mia rete sono raggiungibili. Il mio codice Java è la seguente:Java InetAddress.isReachable() timeout

InetAddress adr = InetAddress.getByName(host); 
if(adr.isReachable(3000)){ 
    System.out.println(host + " is reachable"); 
} 

Questo funziona abbastanza bene, se abbasso il timeout di dire 500ms, invece, non designa più l'host raggiungibile. Ho in programma di controllare parecchi host in un ciclo, quindi avere un timeout basso è abbastanza importante. Se eseguo il ping dell'host manualmente dalla riga di comando di Windows, sono necessari meno di 10 ms.

Quindi perché il metodo Java ha bisogno di un timeout molto più elevato per avere successo? Esistono alternative all'utilizzo di isReachable()?

risposta

5

Dipende da cosa intendi per raggiungibilità. Se si trovano solo gli host raggiungibili in ascolto su porte specifiche, è possibile aprire una connessione socket su tale porta (ad esempio, trovare tutti i server HTTP controllando la porta 80). L'utilizzo di InetAddress.isReachable() dipende dall'implementazione. Secondo javadoc, "Un'implementazione tipica utilizzerà le RICHIESTE ECHO ICMP". Un controllo di "porta nota" (come http (80), smb (445), ecc.) Che utilizza Java NIO (I/O non bloccante) può avere prestazioni più elevate. La mia azienda ha un prodotto che utilizza una scansione "porta nota" per trovare caselle che eseguono Telnet o SSH, utilizzando NIO, e possiamo scansionare circa 5000 IP/sec.

+0

Grazie, in sostanza sì, vorrei connettermi a/controllare gli host sulla porta 10001 che viene utilizzata dai dispositivi che devo trovare. Potresti dare un esempio su come implementare il controllo della porta conosciuta? – Jerome

+1

Beh, non mi occupo di implementare un metodo I/O non bloccante (NIO). Ma direi solo creare uno zoccolo. Creare un SocketAddress con l'IP di destinazione e la porta 10001. Quindi chiamare socket.connect (SocketAddress, timeout) con il timeout appropriato. Catch TimeOutException. Se il socket.connect() ritorna senza eccezioni, chiudi il socket, sai che il dispositivo è in ascolto su 10001. Per un modello NIO, dai un'occhiata al progetto ed esempi Netty open-source. – brettw