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

API standards et tierces Java Discussion :

Fonction isReachable


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut Fonction isReachable
    Bonjour , je dois effectuer un ping sur les éléments de mon réseau.
    J'ai codé ca comme ca :
    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
    try 
    	        { 	            
    	           hostAddress = InetAddress.getByName(name);  	           
    	        } 
    	        catch(Exception e) 
    	        { 
    	        	System.out.println("Erreur dans l'adresse de l'élément:"+e);
    	        } 
     
    	        try
    	        {
    	        if(hostAddress.isReachable(200)== false)
    		           System.out.println("N'as pas répondu !");
    	        }
    	        catch(Exception e)
    	        {
    	        	System.out.println("Mauvais timeout:"+e);
    	        }
    J'ai toujours aucune réponse de mes éléments (j'ai tester sur 3 serveurs :
    2 allumés, 1 éteint et aucune différence, mon message "N'as pas répondu !" apparaît pour chacun

    Merci d'avance ,

  2. #2
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Repondent-ils avec la commande ping (en mode console)?

    Il semble que la méthode is Reachable pose de nombreux problèmes à ceux qui veulent l'utiliser.

    Si tu as lu la documentation concernant cette méthode alors tu as remarqué que pour utiliser le protocole ICMP (utilisé par la commande ping) il est nécessaide d'avoir certains privilèges. La documentation ne dit rien sur ces privilèges.

    Si elle n'est pas autorisé à utiliser ICMP COMMAND ECHO, la méthode isReachable s'aiguille vers le service 'ECHO' (Port 7) . Le port 7 est souvent fermé.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    try 
    	        { 
    	        	hostAddress = InetAddress.getByName(name); 	         
    	              final boolean ping = hostAddress.isReachable(1000); 
    	              if(ping == true)
    	            	System.out.println("Ping réussi");
    	              else
    	              	System.out.println("Pas de réponse au ping"); 
    	        } 
    	        catch(Exception e) 
    	        { 
    	           System.err.println("Hôte inconnue: "+e); 	       
    	        }
    ça marche

    Pour les droits sur le réseau , j'ai pas de soucis.
    Donc cette methode devrait porter ses fruits.

    J'ai remarqué que je dois mettre une timeout de 2000ms pour pouvoir recevoir une réponse de mes éléments. Par soucis de vitesse je voudrais au moins baisser la valeur à 1000.
    En essayant 1000 mes éléments répondent mais quelques fois non.
    Pourtant quand je les ping sous dos , la réponse est <1ms !
    Alors est ce que vous pensez que isReachable utilise ICMP ou le port 7 chez moi ?

  4. #4
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Difficile de te répondre

    Je te conseille de télécharger Ethereal ou autres utilitaires pour analyser le réseau.

  5. #5
    Membre chevronné Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Par défaut
    Par soucis de vitesse je voudrais au moins baisser la valeur à 1000.
    En essayant 1000 mes éléments répondent mais quelques fois non.
    Que veux tu dire par soucis de vitesse ?
    Si tu as voulu dire : "J'ai peur que si tous mes sites sont inacessible, et que j'en ai 10 a tester, je vais attendre 10 sec avant que mon application de continue". Si c'est ça que tu crains, cree un Thread a chaque fois que tu veux faire un ping (qui se chargera e faire le ping biensur !) et ton application principale n'aura qu'a attendre qu'ils aient tous répondu et là tu gagnera considérablement du temps.

    Sinon tu peux bidouiller un peu en mettant une valeur de Timeout assez faible, puis en cas d'echec l'augmenter jusqu'a une valeur limite dont tu es sur qu'il s'agit bien d'un site HS.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    oui je croi sque tu as bien résumé !

    mais je n'ai toujours pas résolu mon soucis.
    Je vais lire la doc InetAddress , si vous avez des infos sur le mode opératoire du ping via isReachable je suis prenneur !

    A votre avis , vu les temps de réponse que j'obtient ( quelques fois > 1000ms ) quel est le mode opératoire de mon ping ? ( ICMP ou ouverture d'un port ?)

  7. #7
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut


    Justement avec une analyseur de réseau. Tu as la réponse en moins d'une heure. Et en plus si tu travailles dans ce domaine, c'est un outil indispensable...

    Mais tu es libre de perdre ton temps

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    je suis apprenti , laisse moi le temps de réfléchir

  9. #9
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Citation Envoyé par adiGuba
    Si ton réseau local utilise le protocole NetBIOS, jette un coup d'oeil à ceci :
    http://www.developpez.net/forums/vie...374106#2374106

    Il s'agit d'un bug corrigé dans la version 1.5.0_06...

    Il y a un bug qui a été corrigé dans la version 1.5.0_06 (pas de bol) qui concerne la résolution de nom de domaine NetBIOS : pour chaque connection le nom de domaine NetBIOS est recherché, et cela prend entre 4 et 6 secondes environ...

    Pour éviter cela sans changer de version :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ProxySelector.setDefault(null);
    a++

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    Ca ne change rien ;D je ne dois pas utiliser NetBios à mon avis . Mais c'est bon à retenir

  11. #11
    Membre chevronné Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Par défaut
    Je reviens avec mon histoire de Thread, voilà ce que ca donne :
    2 classes, une qui contient le Main : AnalyserReseau.java
    l'autre ThreadPing.java qui hérite de Thread et fait un ping :

    AnalyserReseau.java :

    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
    36
    37
    38
    39
     
    import java.util.ArrayList;
    import java.util.Date;
     
    public class AnalyserReseau {
     
    	public static void main(String[] args) {
     
    		//Liste de tous les machines/sites a tester
    		ArrayList<ThreadPing> maListe = new ArrayList<ThreadPing>();
    		maListe.add(new ThreadPing("<a href="http://www.developpez.com"));	//sera" target="_blank">www.developpez.com"));	//sera</a> OK	
    		maListe.add(new ThreadPing("www.microsoft.com"));	//provoquera une erreur
    		maListe.add(new ThreadPing("www.google.com"));		//provoquera une erreur
    		maListe.add(new ThreadPing("java.developpez.com"));	//sera OK	
     
    		//debut des Ping sachant qu'il y a des sites ou ça va foirer !!!
    		Date dateDebut = new Date();
    		for( ThreadPing tp : maListe)
    		{
    			tp.start() ;
    		}
     
    		try{
    			for( ThreadPing tp : maListe)
    			{
    				tp.join() ;
    			}
    		}catch(InterruptedException ie)
    		{
    			ie.printStackTrace();
    		}
    		Date dateFin = new Date();
    		//fin ping
    		long diff = dateFin.getTime() - dateDebut.getTime();
    		System.out.println("Tps execution => "+diff);
     
    	}
     
    }
    ThreadPing.java :

    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
    36
    37
    38
     
    import java.net.InetAddress;
     
    public class ThreadPing extends Thread 
    {
    	private String nom  ;
    	private boolean pingOK = false ;
    	private final int tpsTimeOut = 2000;
     
    	public ThreadPing( String nomMachineATester )
    	{
    		this.nom = nomMachineATester ;
    	}
     
    	public void run()
    	{
    		try{
    			InetAddress i = InetAddress.getByName(nom);
    			pingOK = i.isReachable(this.tpsTimeOut);
    			if(pingOK)
    			{
    				System.out.println(this.nom +" => OK");
    			}
    			else
    			{
    				System.out.println(this.nom +" => ECHEC !!!");
    			}
    		}catch(Exception e)
    		{
    			e.printStackTrace();
    		}
    	}
     
    	public boolean isPingOk()
    	{
    		return this.pingOK ;
    	}
    }

    Et comme résultat de l'execution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <a href="http://www.developpez.com" target="_blank">www.developpez.com</a> => OK
    java.developpez.com => OK
    scorpyosis.free.fr => OK
    www.microsoft.com => ECHEC !!!
    www.google.com => ECHEC !!!
    Tps execution => 2062

    Donc avec cette solution, tu peux faire tous tes tests sans plomber le temps d'attente dans ton application, ici j'ai mis un timeout de 2sec et malgrés 2 echecs, c'est le temps maximal que tu attendras, et non 4sec si on avait fait les tests a la suite.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    Merci pour ton thread , ça m'aide beaucoup !

  13. #13
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    Citation Envoyé par Scorpyosis
    Donc avec cette solution, tu peux faire tous tes tests sans plomber le temps d'attente dans ton application, ici j'ai mis un timeout de 2sec et malgrés 2 echecs, c'est le temps maximal que tu attendras, et non 4sec si on avait fait les tests a la suite.
    Je ne te suis pas là, peux-tu étre plus clair s'il te plait.
    Merci


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  14. #14
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Par défaut
    la mthode .isReachable() doit envoyer plusieurs paquet sur le reseau
    il attend donc surement le nb de reponses correspondantes et donc il lui faut un certain temps

  15. #15
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Par défaut
    a propos de ton thread n'oubli pas de declarer ta methode run Synchronised de telle facon que deux thread ne peuvent pas s'entremeler les pinceaux avec les differentes variables tu peut lancer tous les Thread en meme temps !!!

  16. #16
    Membre chevronné Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Par défaut
    Citation Envoyé par yann999
    a propos de ton thread n'oubli pas de declarer ta methode run Synchronised de telle facon que deux thread ne peuvent pas s'entremeler les pinceaux avec les differentes variables tu peut lancer tous les Thread en meme temps !!!
    Je vois pas l'interet de mettre la methode run synchronized etant donné que il n'y a pas de variable partagées ? Pour chaque Ping, on crée un thread, et chaque thread a ses propres variables, donc le synchronized je vois pas trop ce qu'il vient faire là

  17. #17
    Membre chevronné Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Par défaut
    Biensur,

    la fonction isReachable(timeout), va en cas d'echec du ping attendre le timeout (logique) avant de renvoyer false.

    Si on fait des pings de façon sequentiel sur plusieurs sites par exemple 5.
    Sur ces 5 sites, imaginons que les 3 premiers sites sont HS, et que les 2 autres repondent a 250ms. le timeout est fixé a 2000 ms. On obtient ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    t=0ms
    ping site1   =>  Echec
    t=2000ms
    ping site2   => Echec
    t=4000ms
    ping site3   => Echec
    t=6000ms
    ping site4   => OK
    t=6250ms
    ping site5   => OK
    t=6500ms
    On obtient donc un tps d'execution de 6500ms pour tous les ping;

    maintenant en multithread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    t=0ms
    lancement du ping1  => Echec
    lancement du ping2  => Echec
    lancement du ping3  => Echec
    lancement du ping4  => Ok
    lancement du ping5  => Ok
    attente de tous les thread <=> methode join()
    fin des ping
    t=2000ms
    Malgrés les 3 echecs, on a toujours un temps d'execution qui est majoré par la valeur du timeout. C'est a dire qu'au pire des cas on attendra timeout ms pour faire les tous les ping. (a qq ms pres biensur)
    Et on n'est plus dans le cas NbSiteEchec * timeout.

    Voilà, j'espère avoir été clair maintenant ?

  18. #18
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    Merci d'avoir pris le remps de repondre ,
    mais ce que je ne comprends pas c'est qu'avec join() tu dois quand mème attendre que tous les threads aient fini leur travail, donc si je suis mon raisonnement tu devras attendre 3*(timeout) pourque les trois premiers threads aient fini.

    Où ai-je commis une erreur ?


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  19. #19
    Membre chevronné Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Par défaut
    Justement non, c'est la toute la magie des threads, vu que tous les thread sont lancés en meme tps, et qu'ils s'executent en paralleles tu n'auras pas a attendre 3*timeout, mais seulement une seule fois timeout. Je vais essayé de faire ça de façon graphique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    t=0                            lancement de tous les threads
                                                          |
       -------------------------------------------------------------------------------------------------
       |                       |                      |                         |                     |
    Ping 1                   Ping2                   Ping3                     Ping4               Ping5
       |                       |                      |                         |                     |
     on attends            on attends             on attends                 Ping Ok               Ping OK
     2 sec                  2 sec                    2 sec                     250ms               250ms  
       |                       |                      |                         |                    | 
      --------------------------------------------------------------------------------------------------
                                                       |
                                                    join()
    t=2000ms
    Certes il a y a 3 echecs, mais comme les 3 echecs se font dans le mm interval de temps, tu n'as pas a attendre 3*timeout.
    On attends bien que tous les threads aient fini, donc ici ping4 et ping5 ont fini tres vites, on attends Ping1, ping2, ping3. Mais ceux ci vont finir en mm tps donc seulement 2000ms von s'être écoulé, d'ou le gain de temps considérable.

    Ai-je été clair ?

  20. #20
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    Tu as été clair. Mais j'ai le regret de t'annoncer que c'est pas comme ça que fonctionne les threads, ta version serait valable si on avait un processeur pour chaque thread mais en réalité on en a qu'un seul.
    Je te renvoie à ce tutorial très bien fait qui explique le fonctionnement des threads beaucoup mieux que je ne l'aurais fait.Tu y apprendra que la notion de parallélisme n'est en fait qu'une "illusion".

    Je salue ton aimabilité d'avoir repondu à mes questions, et j'apprécie ta volonté à essayer de comprendre les choses.


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Fonction API
    Par margilb dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2002, 11h11
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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