2013-06-09 14 views
6

Sto lavorando su un progetto Java che deve avere una connessione Internet in ogni momento.Come verificare la connettività Internet in Java

Desidero che il mio programma continui a controllare la connessione Internet a intervalli di tempo (ad esempio 5 o 10 secondi) e visualizzi un messaggio non appena viene rilevata alcuna connessione Internet.

Ho provato ad utilizzare il metodo isReachable per ottenere questa funzionalità, al di sotto è il codice -

try 
{ 
    InetAddress add = InetAddress.getByName("www.google.com"); 
    if(add.isReachable(3000)) System.out.println("Yes"); 
    else System.out.println("No"); 
} 
catch (UnknownHostException e) 
{ 
    System.out.println("unkownhostexception"); 
} 
catch (IOException e) 
{ 
    System.out.println("IoException"); 
} 

Ma questo codice restituisce sempre "No". Qual è il problema con questo codice?

Grazie

+1

http://stackoverflow.com/questions/9922543/why-does-inetaddress-isreachable-return-false-when-i-can-ping -the-ip-address – uselpa

+0

Grazie, ma la soluzione offerta lì, non funziona nel mio caso. anche l'autore ha detto che il suo trucco potrebbe non funzionare in alcuni casi. –

risposta

9

L'unico modo in cui sono a conoscenza è l'invio di un pacchetto a un host noto, conosciuto nel senso che si sa che sarà sempre attivo e funzionante e raggiungibile dal sito di chiamata.

Tuttavia, ad esempio, se si sceglie un host con nome, il ping potrebbe non riuscire a causa di un errore di ricerca DNS.

Penso che non dovresti preoccuparti di questo problema: se il tuo programma ha bisogno di una connessione Internet, è perché invia o riceve dati. I collegamenti non sono un concetto continuo come un fiume, ma sono più simili a una strada. Quindi basta usare lo standard Java per gestire gli errori di connessione: IOExceptiions. Quando il tuo programma deve inviare dati, l'API sottostante eseguirà automaticamente un IOE nel caso in cui la rete non sia attiva. Se il tuo programma si aspetta dati, invece, usa un timeout o qualcosa del genere per rilevare possibili errori nello stack di rete e segnalarlo all'utente.

15

Sono d'accordo con il suggerimento di Raffaele se hai solo bisogno di usare internet frequentemente. Prova a farlo e preparati a gestire le eccezioni quando fallisce.

Se è necessario monitorare la disponibilità di Internet per qualche motivo, anche quando non si intende utilizzarlo ancora e non si sa a chi ci si connetterà, basta provare una connessione a un bene noto sito (google.com, amazon.com, baidu.com ...).

Questo funziona per testare alcuni siti:

public static void main(String[] args) { 
    System.out.println(
     "Online: " + 
     (testInet("myownsite.example.com") || testInet("google.com") || testInet("amazon.com")) 
    ); 
} 


public static boolean testInet(String site) { 
    Socket sock = new Socket(); 
    InetSocketAddress addr = new InetSocketAddress(site,80); 
    try { 
     sock.connect(addr,3000); 
     return true; 
    } catch (IOException e) { 
     return false; 
    } finally { 
     try {sock.close();} 
     catch (IOException e) {} 
    } 
} 
+1

sì, sto facendo qualcosa di simile. Molte grazie ! –

+0

Funziona, grazie mille. Il metodo testInet() è ciò che fa il trucco. – russellhoff

Problemi correlati