Java Vérifiez rapidement la connexion réseau
Ma question est assez simple. Mon programme prévoit la notification immédiate si une connexion réseau est perdue. Je suis à l'aide de Java 5, donc je ne suis pas en mesure d'utiliser les très pratique dispose de NetworkInterface.
Actuellement, j'ai deux différentes méthodes de vérification pour une connexion réseau:
(essayez..captures supprimé)
Méthode:
URL url = new URL("http://www.google.com");
HttpURLConnection urlConnect = (HttpURLConnection) url.openConnection();
//trying to retrieve data from the source. If offline, this line will fail:
Object objData = urlConnect.getContent();
return true;
Méthode 2:
Socket socket = new Socket("www.google.com", 80);
netAccess = socket.isConnected();
socket.close();
return netAccess;
Cependant, ces deux méthodes permettent de bloquer jusqu'à ce qu'un Délai est atteint, avant de retourner false. J'ai besoin d'une méthode qui retourne immédiatement, mais est compatible avec Java 5.
Merci!
EDIT:
J'ai oublié de mentionner que mon programme dépend des adresses IP, pas de noms DNS. Afin de vérifier qu'une erreur lors de la résolution d'un hôte...
2ème EDIT:
Trouvé une solution définitive à l'aide de NetworkInterface:
Enumeration<NetworkInterface> eni = NetworkInterface.getNetworkInterfaces();
while(eni.hasMoreElements()) {
Enumeration<InetAddress> eia = eni.nextElement().getInetAddresses();
while(eia.hasMoreElements()) {
InetAddress ia = eia.nextElement();
if (!ia.isAnyLocalAddress() && !ia.isLoopbackAddress() && !ia.isSiteLocalAddress()) {
if (!ia.getHostName().equals(ia.getHostAddress()))
return true;
}
}
}
source d'informationauteur BenCole
Vous devez vous connecter pour publier un commentaire.
De JGuru
Utilisation de Java2s
Si vous voulez éviter le blocage de l'utilisation de Java NIO (Non-bloquant IO) en java.nio paquet
De la malchance. Vous ne pouvez pas obtenir une notification immédiate avec le protocole TCP/IP. Il est plein de mise en mémoire tampon et les tentatives et les délais d'attente, afin de ne pas faire rien immédiatement, et TCP par le design n'a rien correspondant à un 'tonalité', ni aucune API. Le seul moyen de détecter une perte de connexion est d'essayer de faire des I/O sur elle.
Ils ne vous aidera pas non plus. Tout ce qu'ils peuvent vous dire si une carte réseau est en haut ou en bas, rien sur l'état de votre connexion avec le reste du monde.
Qui expire une défaillance du serveur DNS si vous êtes en mode hors connexion.
Idem. Cependant, même si elle n'a pas de prise.isConnected() retourne toujours true. Ces Api comme isConnected(), isBound(), isClosed(), seulement vous dire ce que vous ont fait pour la socket. Ils ne vous dit rien sur l'état de l' connexion. Ils ne peuvent pas, pour la raison que j'ai donné ci-dessus.
Et vous avez oublié de fermer la socket dans le cas d'une exception, si vous avez une fuite de ressources.
Impossible pour les raisons indiquées. Vous avez besoin de redéfinir autour de la prise de conscience que cette fonction n'existe pas.
Vous devez d'abord créer un
interface
appeléNetworkListener
par exempleEnsuite, créez une classe et de l'appeler
NetworkStatusThread
par exemplePuis dans votre classe qui instancie le
Thread
faites ceci:Aussi, dans cette catégorie, vous devez
implement
laNetworkListener
afin d'obtenir les rappels.Dans votre
run()
méthode ci-dessus, vous pouvez mettre en œuvre le code de @Ali, mais passer mon statut:Avez-vous tenter par l'émission d'un DNS résoudre?
Vous pouvez essayer avec:
mais je n'en suis pas sûr si cela va exiger que le délai d'attente trop..