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 :

Réception UDP, passer un tour de boucle


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2013
    Messages : 26
    Par défaut Réception UDP, passer un tour de boucle
    Bonjour,

    Voici la situation : je me connecte successivement à différents serveurs via une socket UDP au travers d'une boucle afin de récupérer certaines informations. Cependant il se peut que dans certains serveurs ne soient pas en route. Est-il possible de définir un temps d'attente max pour la réception pour "esquiver" un tour de boucle et ainsi continuer à parcourir les serveurs tout en gardant les informations obtenues avant et après le passage par le serveur "éteint" ?

    voici mon bout de code qui vous aidera sans doute à comprendre :

    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
    //shop est la liste des serveurs
    while (shop.hasNext())
    			{
    				String currentShop = shop.next() ;
    				out.print("<form action='AdminManager'>Boutique " + currentShop);
    				out.print("<input type='hidden' name='action' value='validate' />");
    				out.print("<input type='hidden' name='port' value='"+ displayShops.gs.getPortCommande(currentShop) +"' />");
     
     
    				DatagramPacket packet = new DatagramPacket(message,message.length,
    				                                        new InetSocketAddress("localhost", displayShops.gs.getPortCommande(currentShop)));
     
    //on demande au serveur de nous envoyer la liste
    				socket.send(packet);
     
    //on se prepare a recevoir
    				byte[] reponse = new byte[1024] ; 
    				packet = new DatagramPacket(reponse,reponse.length);
    				try
    		        {
    					socket.receive(packet); 
    		            doc = sxb.build(new ByteArrayInputStream(packet.getData(),packet.getOffset(),(packet.getOffset()+packet.getLength())%1024));
    		            racine = doc.getRootElement();
    					Iterator<Element> commandes = racine.getChildren("commande").iterator();
     
    					while (commandes.hasNext())
    					{
    						Element current = commandes.next();
    						out.print("\t<p><input type='checkbox' name='commande' value='" + current.getChildText("id") +"' /> Commande " + current.getChildText("id") + " " + current.getChildText("date") + "</p>");
    					}
    					out.print("<p><input type='submit' value='Valider' /></p></form>");	
    		        } catch(JDOMException e){
    		        	    System.err.println("Erreur lors de la lecture de la reponse du serveur: " + e);
    		        	    System.exit(-1);
    		        	} catch (IOException e) {
    		        		System.err.println("(Reception Client) Erreur lors de la reception du message-reponse : " + e);
    		        	    System.exit(-1);
    		        	   }
    		}
    Merci d'avance pour votre aide.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Pour le receive(), tu as une notion de timeout par la méthode setSOTimeout().

    Cela dit, pourquoi ne pas se connecter en parallèle sur chaque serveur (un thread par connexion) : comme ça, aucun des accès n'est "bloqué" par un autre... Les connexions à des serveurs absents ne fonctionnent pas et on les ignore, c'est tout. Globalement le temps de réception de tes données sera le max des temps de réception de chaque connexion, au lieu d'être le cumul...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2013
    Messages : 26
    Par défaut
    J'ai en effet essayé avec des threads cependant les out.print se mélangent, je n'ai par exemple aucun resultat dans la premiere table et des resultats dans la deuxieme table qui devraient etre dans la premiere...

    Quelle partie de mon code mettriez-vous dans le run du thread ?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Si ce sont des logs que tu traces, ils devraient être unitaire et, donc, ça ne pose pas vraiment de problème qu'ils soient mélangés (Si ces logs sont bien formattés, on aura le nom du thread, le date et heure, la classe, la méthode et la ligne de log, etc..., tout ce qu'il faut pour s'y retrouver).
    S'il s'agit de rapport résultat, il suffit de construire ce résultat dans le thread, et de le tracer unitairement lors qu'il est complet, ou de le sortir dans un fichier à part, ou de l'afficher dans la GUI, ou autre. Si tu as besoin de collecter des résultats de plusieurs connexions pour faire un résultat unique, collectes les dans une classe dédiée, avec une liste de rapport, et un CountDownLatch pour déterminer que tous les résultats sont produits, pour produire le rapport cumulé.

    Je mettrais l'ensemble du contenu du bloc while dans un thread à part (fais toi une classe "boite noire", qui prend en entrée les paramètres et donne en sortie un résultat.

    Là ou tu as :

    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
    pour tous les serveurs {
    
        préparer paramètres de connexion
       essayer {
        se connecter
        attendre le résultat avec un timeout
        si timeout atteint 
            loguer serveur ne répond pas
        sinon
           afficher le résultat 
        fin si
       } en cas d'erreur {
           loguer erreur
       }
    
    }
    Tu auras :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    pour tous les serveurs {
     
        préparer paramètres de connexion
        lancer thread avec ces paramètres
     
    }
    éventuellement attendre que tous les résultats sont prêts (CountDownLatch)
    et le thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       
       essayer {
        se connecter
        attendre le résultat avec un timeout
        si timeout atteint 
            loguer serveur ne répond pas
        sinon
           afficher le résultat 
        fin si
        } en cas d'erreur {
           loguer erreur
        }
       éventuellement décrémenter le countdownlatch
    Quand je parle de thread, ça peut être un service d'exécution (ExecutorService), qui te permettra éventuellement de gérer des pools, de contrôler le nombre de threads, etc.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2013
    Messages : 26
    Par défaut
    Je m'en suis sortis, merci beaucoup.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réception UDP et test de chaine
    Par molotov dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 28/03/2008, 17h14
  2. [XSLT] Plusieurs noeuds fils en 1 tour de boucle
    Par Korko Fain dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 29/05/2007, 14h30
  3. [T-SQL]Skipper un tour de boucle while
    Par agougeon dans le forum Sybase
    Réponses: 2
    Dernier message: 04/08/2006, 13h26
  4. [Tableaux] Boucle while + passer un tour
    Par Girzi dans le forum Langage
    Réponses: 12
    Dernier message: 28/06/2006, 10h41
  5. [PL/SQL] [9i] Prochain tour de boucle
    Par ftrifiro dans le forum Oracle
    Réponses: 4
    Dernier message: 18/05/2006, 11h03

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