IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Méthode isReachable beaucoup trop lente


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2009
    Messages : 238
    Par défaut Méthode isReachable beaucoup trop lente
    Bonjour à tous

    Pour le développement d'une appli je doit effectuer un ping sur un apache afin de vérifier qu'il est bien en ligne. J'ai donc utilisé la classe InetAdress comme suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		String host = "monIp";
    		int timeout = 25000;
    		boolean status=false;
                    status = InetAddress.getByName(host).isReachable(timeout);
    Mais pour que la méthode isReacheable me ramène un résultat (status = true) j'ai été obligé de configurer mon timeOut à 25s ce qui est beaucoup trop lent (je compte afficher l'état de l'apache à chaque rafraichissement d'une page web... à 25s le rafraichissement l'appli ne va pas faire long feu ^^)

    Est-ce quelqu'un aurait une idée sur le pourquoi du comment cela met autant de temps et sur la solution pour accélérer tout ça?

    Je vous remercie d'avance de toute contribution qui seras (croyez-le) grandement appréciée

  2. #2
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Bonjour,

    je n'ai hélas pas de solution, mais j'ai deux pistes à te proposer.

    Dans ta ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    status = InetAddress.getByName(host).isReachable(timeout);
    Il y a plusieurs opérations :
    1. La résolution du nom de l'hôte
    2. La transformation en InetAddress
    3. Le test isReachable


    Piste 1 : Tu n'es pas obligé de tout refaire à chaque fois, en particulier les deux premières étapes peuvent être faites une fois de temps en temps.

    Piste 2 : Dans la mesure où tu utilises une IP, tu n'es pas obliger de résoudre le nom de l'hôte, tu pourrais remplacer
    par
    En effet, selon ta config système/réseau, la résolution d'un nom d'hôte peut être tèrs lente.

    Courage.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2009
    Messages : 238
    Par défaut
    Hello!!

    Tout d'abord merci de ta réponse, j'ai donc tenté ta solution comme suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    String host = "monIp";
            byte[] adr = new byte[]{15,24,new Integer(165).byteValue(),new Integer(181).byteValue()};
            int timeout = 25000;
            boolean status=false;
            try {
                 status = InetAddress.getByAddress(host, adr).isReachable(timeout);
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
     
                e.printStackTrace();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
    Mais malheureusement aucun changement...

    Par contre le fait que je travail sur une machine de dèv pas vraiment récente et pas vraiment rapide pourrait-il avoir une influence? sachant qu'a terme l'application fonctionnera sur un serveur.

    De plus lorsque je tente un ping sur une adresse "classique" aucun problème, mais il s'agit ici d'adresses internes (un tomcat derrière un apache, le tout doublé en load balancing), est-ce que ça pourrait avoir une influence aussi?

  4. #4
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    S'il s'agit d'une adresse locale, pourquoi ne pas essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    byte [] b = new byte[] {(byte)127,(byte)0,(byte)0,(byte)1};
    status = InetAddress.getByAddress(b).isReachable(timeout);

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    faites un sniff de la communication réseau. ça permettra d'avoir une idée d'ou est le problème et qu'est-ce qui prend du temps (l'envoi du piong, la réponse) et quel protocole est utilisé (ICMP, echo?)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2009
    Messages : 238
    Par défaut
    yop

    désolé mais je ne vois pas trop ce que tu veut dire par un sniff réseau.. (moi et les réseaux informatiques ça fait deux.. voir trois )

    Bon toujours est-il que j'ai réussie à résoudre mon problème en me passant de la méthode isReacheable et en passant directement par une commande ping via java comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    public static void main(final String[] args) {
     
            String host = "225.26.194.158";
            boolean status = false;
            String cmd = "ping " + host;
            String resultat = null;
            try {
                Runtime r = Runtime.getRuntime();
                Process p = r.exec(cmd);
     
                BufferedReader r1 = new BufferedReader(new InputStreamReader(p
                        .getInputStream()));
                String x;
                StringBuffer sb = new StringBuffer();
                while ((x = r1.readLine()) != null) {
                    sb.append(x);
                    System.out.println(x);
                }
                resultat = sb.toString();
                r1.close();
                p.waitFor();
            }
            catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
     
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            String pouet = "us = 4,";
                System.out.println(pouet);
            status = resultat.contains(pouet);
            System.out.println(status);
        }
    Seul dernier petit problèmes, comme vous pouvez le remarquer pour tester si mon ping est passé ou non, je test si je trouve le string (us = 4,) dans la chaîne qui à réceptionné le résultat de la commande. Pourquoi us = 4, et pas reçu = 4 me direz vous? car le ç ne passe pas lorsque j'enregistre le résultat de ma commande (surement un problème de norme de caractère, je suis en utf8) mais je ne peut pas changer de norme malheureusement... auriez vous une idée pour changer cela? Ce n'est pas un problème bloquant car le code fonctionne et me donne le résultat attendu mais bon, le test n'est pas très beau et j'aime pas les choses pas belles ^^

Discussions similaires

  1. Méthode BindingSource.MoveNext trop lente
    Par BasicZX81 dans le forum VB.NET
    Réponses: 1
    Dernier message: 01/07/2012, 22h44
  2. boucle while trop lente
    Par atouze dans le forum Access
    Réponses: 17
    Dernier message: 15/06/2005, 16h35
  3. Taille du fichier gdb augmente beaucoup trop
    Par Y dans le forum Débuter
    Réponses: 4
    Dernier message: 01/04/2005, 12h46
  4. [SAGE] ODBC trop lent
    Par tileffeleauzed dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 14/11/2004, 09h56
  5. Envoi de mail trop lent
    Par MASSAKA dans le forum ASP
    Réponses: 3
    Dernier message: 15/10/2004, 10h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo