Stat connexion

Résolu/Fermé
khalil-kt Messages postés 16 Date d'inscription lundi 13 juin 2016 Statut Membre Dernière intervention 10 juillet 2016 - 25 juin 2016 à 19:27
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 28 juin 2016 à 20:05
Bonjour,
je développe actuellement un logiciel qui réagi au moment où l'internet se coupe,
est ce qui'il a une classe qui permet d'obtenir le statut de la connexion,
et merci;
ps : je suis sur windows

3 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 25/06/2016 à 20:46
Bonjour,

Le seul moyen de vérifier la connexion c'est de faire un test sur une page quelconque sur internet et vérifier quelle répond correctement.

import java.net.*;

private static final String TEST_HOST = "www.google.fr";

/**
 * @return connection time (in nanoseconds) or -1 if connection fails
 */
public static long checkConnection() {
    try {
        long t = System.nanoTime();
        InetAddress.getByName(TEST_HOST);
        return System.nanoTime() - t;
    } catch (UnknownHostException e) {
        return -1;
    }
}
La confiance n'exclut pas le contrôle
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 26/06/2016 à 14:06
Remarque : InetAddress possède un cache pour les noms de domaines, du coup si on fait une boucle sur checkConnection (avec le code précédent) seule la première valeur fait vraiment une connexion, les autres résultats sont issus du cache. Donc si la connexion fonctionne au moins une fois on aura toujours le résultat, même si ça plante ensuite, ce qui n'est donc pas très intéressant.

Donc soit on implémente une vraie connexion vers la page cible et on vérifie qu'elle répond, mais cela sollicite inutilement le serveur cible et prends beaucoup plus de temps...
Soit on récupère ce cache pour pouvoir effacer la page cible de ses données avant de l'interroger, c'est ce que je propose avec le code ci-dessous :

private static final Map<String, ?> inetAddressCache = getInetAddressCache();

@SuppressWarnings("unchecked")
private static Map<String, ?> getInetAddressCache() {
    try {
        Field addressCacheField = InetAddress.class.getDeclaredField("addressCache");
        addressCacheField.setAccessible(true);
        Object addressCache = addressCacheField.get(null);
        Field cacheField = addressCache.getClass().getDeclaredField("cache");
        cacheField.setAccessible(true);
        Object cache = cacheField.get(addressCache);
        return (Map<String, ?>) cache;
    } catch (Exception e) {
        throw new IllegalStateException("Can't get InetAddress cache", e);
    }
}

Quelques évolutions donc :

/**
 * @param host the specified host
 * @return connection time (in nanoseconds)
 *         with positive sign if it succeeded or negative sign if it fails
 */
public static long checkConnection(String host) {
    inetAddressCache.remove(host);
    long t = System.nanoTime();
    try {
        InetAddress.getByName(host);
        return System.nanoTime() - t;
    } catch (UnknownHostException e) {
        return t - System.nanoTime();
    }
}

Là j'ai testé, et en faisant une boucle sur checkConnection() je repère immédiatement quand internet est coupé (les valeurs passent négatives) et quand il est de nouveau accessibles (les temps reviennent positifs)

Exemple :

public static void main(String[] args) {
    new Timer().schedule(new TimerTask() {
        public void run() {
            Date date = new Date();
            long t = checkConnection("www.google.fr");
            System.out.println(date + "\t" + t);
            if (t < 0) // alert beep
                Toolkit.getDefaultToolkit().beep();
        }
    }, 0, 1000);
}

Voici à quoi ressemble le tracé des points (on voit bien la coupure internet)

La majorité des succès répondent entre 0.5 et 0.7 ms et les échecs en moins de 0.1 ms, même s'il y a quelques valeurs très au-dessus en cas d'échecs (jusqu'à 15 ou 20 secondes, ce qui explique les "trous" vers 1:52:00 et 1:52:30)

Si on faisait une vraie connexion à la page (avec URL.openStream() par exemple) on obtiendrait des temps de réponses de 30 à 40 ms, soit 50 fois plus long.
0
khalil-kt Messages postés 16 Date d'inscription lundi 13 juin 2016 Statut Membre Dernière intervention 10 juillet 2016
26 juin 2016 à 00:15
merci pour votre réponse, j’espérais trouver un moyen mieux mais tant pis ça marche aussi
merci encore une fois
0
khalil-kt Messages postés 16 Date d'inscription lundi 13 juin 2016 Statut Membre Dernière intervention 10 juillet 2016
27 juin 2016 à 23:10
J'ai essayer mais après un certain temps ça bug, je pense qu c'est le cache qui n'est pas bien supprimer,
ps : j'ai aussi séparer fonction (peut être c'est la source du problème)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
27 juin 2016 à 23:24
Je n'ai pas bien compris où tu en étais... Quel est ton code actuel ?

Quand tu dis que ça bug, qu'est-ce que cela signifie ? Tu as une erreur ? Laquelle ?
0
khalil-kt Messages postés 16 Date d'inscription lundi 13 juin 2016 Statut Membre Dernière intervention 10 juillet 2016 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
27 juin 2016 à 23:53
tu m'as donné un code pour vérifier la connexion internet, mais après tu as ajouter à ce code une parti qui sert à vider le cache de InetAddress,
le bug c'est qu'il ne détecte plus, et quand l'internet se coupe il ne fait rien.
et merci
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
28 juin 2016 à 20:05
En fait il faudrait uniquement considérer mon deuxième code, celui avec la suppression dans le cache.

Vu mon code d'exemple l'ordinateur va biper (si le son est allumé) quand internet sera coupé :

long t = checkConnection("www.google.fr");
if (t < 0) // alert beep
    Toolkit.getDefaultToolkit().beep();
0