2009-03-13 7 views
8

Je ne veux pas dire à la dure qu'Internet n'est pas disponible quand j'attrape une exception de url.openStream().Comment tester la disponibilité d'Internet en Java?

Existe-t-il un moyen simple de savoir si l'ordinateur est connecté à Internet en Java? Dans ce scénario, "connecté à Internet" signifie pouvoir télécharger des données à partir d'une URL spécifique.

Si j'essaie de télécharger à partir d'elle et il n'est pas disponible, alors le programme se bloque un peu. Je ne veux pas que ça pende. Par conséquent, j'ai besoin d'un moyen rapide de demander si le site est disponible ou non.

Répondre

10

Le problème que vous tentez d'éviter est l'attente de votre connexion http pour déterminer que l'URL à laquelle vous essayez d'accéder est réellement indisponible. Pour ce faire, vous devez arrêter d'utiliser url.openStream() qui est un raccourci pour openConnection(). GetInputStream() et obtenir un meilleur contrôle sur votre connexion.

URLConnection conn = url.openConnection(); 
conn.setConnectTimeout(timeoutMs); 
conn.setReadTimeout(timeoutMs); 
in = conn.getInputStream(); 

Ce code vous permettra de délai d'attente de la tentative de connexion si soit la connexion ou la lecture dépasse le temps que vous fournissez dans le timeoutms paramater.

+0

c'est seulement une solution médiocre parce que vous aurez toujours un "hang" sauf si vous le faites dans un autre fil. – Chii

+0

Pouvez-vous suggérer un meilleur? J'utilise déjà un fil séparé pour télécharger les données. – Penchant

2

Vous pourriez être en mesure de dire si un computeur est connecté à un réseau, mais même s'il n'y a aucune garantie que le réseau fonctionne ou qu'il est connecté à Internet.

Ceci est l'un de ces problèmes "sucer et voir".

Quel est le problème avec essayer de se connecter? Et pourquoi êtes-vous inquiet de savoir s'ils sont connectés à Internet?

4

Il n'y a pas de "disponibilité Internet". Imaginez que votre requête HTTP passe par un proxy HTTP transparent, vous essayez d'accéder à un site en liste noire et vous obtenez une réponse HTTP du serveur proxy vous indiquant l'accès refusé. Internet est-il disponible dans ce scénario ou non?

Je pense que vous serez plus précis sur votre problème.

+0

Ceci est une excellente réponse et un point important. – jayunit100

0

Vous pouvez envoyer un message ICMP à un hôte très bien connu ...

+0

Un grand nombre de réseaux, en particulier les réseaux d'entreprise, bloquent le trafic ICMP. – cletus

+0

@cletus il a dit un très "bien connu" ... donc il est supposé être un hôte qui permet le trafic ICMP :) – rogeriopvl

0

Vous pouvez vérifier si un NTP server votre pare-feu ne défend. De toute façon je pense que la meilleure option est d'essayer d'ouvrir une URL que vous essayez d'éviter, parce que le service est le plus souvent ouvert.

Vous pouvez rechercher une ou deux URL dynamiques qui changent constamment. Pour l'instace, un peu de web qui montre l'heure. Par exemple this one j'ai trouvé googleing. Plus d'un parce que les sites peuvent être en panne ;-)

1

Je ne sais pas grand-chose sur la plomberie HTTP de bas niveau disponible en Java, mais vous pouvez toujours émettre une requête HTTP HEAD pour l'URL à l'avance. Cela oblige le serveur à renvoyer uniquement les en-têtes et non les données. Avec un délai de 1-3 secondes, vous devriez être en mesure d'éviter de longs délais.

2

Si le critère est de savoir si vous pouvez accéder à un serveur Web donné, la seule façon de le savoir est d'accéder à ce serveur Web.

Vous pouvez cependant le faire dans un thread d'arrière-plan au démarrage afin que l'application n'en soit pas retardée. Ensuite, la réponse «oui/non» est disponible lorsque le téléchargement réel est souhaité. Mettez un message dans la ligne d'état afin que l'utilisateur sache ce qui se passe et ne soit pas surpris par le fait de se «connecter au réseau» non initié s'il n'est pas connecté lorsque votre programme est démarré.

1

Si votre programme est suspendu en attente de téléchargement, vous utilisez probablement le thread graphique pour effectuer le téléchargement. Si vous utilisez un thread d'arrière-plan, votre programme ne se bloque pas, même si le délai d'attente/téléchargement est long.

5

Utilisez

Process p1 = java.lang.Runtime.getRuntime().exec("ping www.google.com"); 
System.out.println(p1.waitFor()); 
// return code for p1 will be 0 if internet is connected, else it will be 1 
+0

Naga Rishi. Je vous remercie. Bonne réponse. – pudaykiran

Questions connexes