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

avec Java Discussion :

empêcher un Reader de lire s'il y a pas de réponse


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Points : 22
    Points
    22
    Par défaut empêcher un Reader de lire s'il y a pas de réponse
    Bonjour tout le monde j'ai un sérieux problème depuis longtemps et j'ai ouvert plusieurs discussions dessus.

    voilà mon code :

    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
        public static String getResponseQuery(String query) throws Exception {
        	String response = "";
        	URL fileURL;
    		try {
             int timeout = 20000;
     
    	fileURL = new URL(query);	
            URLConnection myConnection = fileURL.openConnection();
            myConnection.setReadTimeout( timeout );
     
     
            BufferedReader in = new BufferedReader(
                                    new InputStreamReader(
                                    myConnection.getInputStream()));
     
            String inputLine;
     
            //Thread.sleep(200000);
     
            while (in.ready() != true) {
            	System.out.println("Test in.ready() :" + in.ready());
            }
     
            while ((inputLine = in.readLine()) != null) {
            	response += inputLine;
            }
     
            in.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			System.out.println( e.toString());		
    		} 
     
    		);	
    		return response; 
        }
    mon problème est que lorsque le serveur distant commence le traitement d'une grosse requête j'obtiens une Exception de type IOException est ce qu'il y a un moyen de tester si InputStream n'est pa vide ?

    En fait comment je peux empêcher mon Reader de lire que lorsqu'il y a de reponse et que s'il y'en a pas il se mets en attente

    Merci

  2. #2
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    L'exception sur les pages longues vient probablement du timeout. Est ce que rallonger ça durée(ou mieux le mettre a 0) ne résout pas le problème?

    Sinon essaie d'être plus clair car j'ai du mal a comprendre ce que tu entends par:
    En fait comment je peux empêcher mon Reader de lire que lorsqu'il y a de reponse et que s'il y'en a pas il se mets en attente

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Points : 22
    Points
    22
    Par défaut
    Je suis désolé de ne pas être assez claire.

    Voilà d'où vient le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     URLConnection myConnection = fileURL.openConnection();
    InputStream iStream = myConnection.getInputStream();
    en fait lorsque je fais getInputStream() et qu'il est vide une IOException est levée, alors comment je peux tester qu'il n'est pas vide avant que je fasse getInputStream() ?

  4. #4
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    Qu'appelles tu: "il est vide?". Tu as fait appel a une page qui n'existe pas? Tu as ouvert un fichier vide?

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Points : 22
    Points
    22
    Par défaut
    Voilà ce que je fait et qui marche très bien

    coté serveur :

    ostream & outS;

    outS << "Content-type: text/xml" <<endl;

    // résultat Traitement

    outS << résultat <<endl;


    et par la suite j'envoie mon outS au programme demandeur, qui a été invoqué par une URL.

    coté client :
    ça marche si le traitement est rapide sinon une exception coté java est déclenchée à cause de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myConnection.getInputStream();
    donc s'il y a un moyen de vérifier avant de faire .getInputStream()
    qui déclenche l'IOException.

    ou d'attendre jusqu'à la fin du traitement je serai preneur.

    à savoir que le programme demandeur est un programme propriétaire je n'ai que le .exe et il marche bien.

    il est tellemnt claire ce que je veux c'est juste de pouvoir tester avant de faire :

    myConnection.getInputStream();
    ou
    myConnection.getResponseCode();

    si je ne teste pas et qu'il est vide ça lève une exception voili voilo.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Points : 295
    Points
    295
    Par défaut
    si tu est sûr du comportement de ton application et de ton code.
    Pourquoi ne pas utiliser un try catch pour traiter l'exception?

    Bien sur cela ne t'empêcheras pas le tps de traitement.

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Points : 22
    Points
    22
    Par défaut
    Je vois bien ce que tu veux dire mais comment retourner pour récupérer le résultat après le traitement de l'exception ?

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Points : 295
    Points
    295
    Par défaut
    je ne suis pas sur de bien comprendre ta demande ...
    mais une boucle while ne ferait elle pas l'affaire ?

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Points : 22
    Points
    22
    Par défaut
    J'ai essayé la boucle while mais dès qu'une exception est levée je sors de la boucle du coup ça n'a pas marché

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    Citation Envoyé par kazabliz Voir le message
    J'ai essayé la boucle while mais dès qu'une exception est levée je sors de la boucle du coup ça n'a pas marché
    Pour ne pas sortir de la boucle en cas d'exception, eh bien il faut traiter l'exception dans la boucle...

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Points : 295
    Points
    295
    Par défaut
    Pour ne pas sortir de la boucle en cas d'exception, eh bien il faut traiter l'exception dans la boucle...
    tout à fais, quand ça ne marche pas pense à nous passer un bout de code ça aide toujours

  12. #12
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Points : 22
    Points
    22
    Par défaut
    voilà le code original :

    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
    40
    41
    42
     public static String getResponseQuery(String query) throws Exception {
        	String response = "";
        	URL fileURL;
    		try {
    			fileURL = new URL(query);	
     
    			HttpURLConnection myConnection = (HttpURLConnection) fileURL.openConnection();
    	        int code = 0;
    	        while ( code != 200) {
    	        	code = myConnection.getResponseCode();
    	        }
     
    	        InputStream iStream = myConnection.getInputStream();
    	        //iStream.notify();
    	        System.out.println(" Je suis ici");
    	        //myConnection.setReadTimeout( timeout );
     
    	        // à tester pour utf-8
    	        //in = new BufferedReader(new InputStreamReader(yc.getInputStream(), "UTF-8"));
    	        myConnection.connect();
    	        myConnection.setConnectTimeout( timeout );
    //  
    //	        while (iStream.available() <= 0) {
    //	        	System.out.println("iStream.available() :" + iStream.available());
    //	        }
    	        BufferedReader in = new BufferedReader(
    	                                new InputStreamReader(iStream));     
    	       //((BindingProvider)proxy).getRequestContext().set("com.sun.xml.ws.request.timeout", 20000);
    	        String inputLine;
    	        //Thread.sleep(200000);
     
    	        while ((inputLine = in.readLine()) != null) {
    	        	response += inputLine;
    	        }
    	        in.close();
    		}
    		catch (IOException  e) {
     
    		}
     
    		return response; //convertToUTF8 (response);
        }
    dans la boucle while normalement je doit avoir un code != de 200 en cas de non réponse mais j'ai une exception à cause de getCode().

    le test while je le fais afin d'éviter de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     InputStream iStream = myConnection.getInputStream();
    car il produit une exception, donc si je trouve quelque chose genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(onResponse) {
     InputStream iStream = myConnection.getInputStream();
     
    }
    ça sera chouette mais je ne trouve pas, surement il y a une façon d'envoyer une requête et de se mettre en écoute dès que quelque chose se produit ou dès qu'une réponse arrive on fait le traitement.

  13. #13
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Points : 22
    Points
    22
    Par défaut
    voilà la boucle que j'ai fait :

    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
    public static String getResponseQuery(String query) throws Exception {
        	String response = "";
        	URL fileURL;
        	boolean noResponse = false;
        	fileURL = new URL(query);	
     
    		HttpURLConnection myConnection = (HttpURLConnection) fileURL.openConnection();
     
        	while (! noResponse) {
    		try {
     
    			System.out.println(" Je suis ici");
    	        InputStream iStream = myConnection.getInputStream();
     
    	        System.out.println(" et maintenent ici");
     
    	        BufferedReader in = new BufferedReader(
    	                                new InputStreamReader(iStream));     
     
    	        String inputLine;
     
    	        while ((inputLine = in.readLine()) != null) {
    	        	response += inputLine;
    	        }
    	        in.close();
    	        System.out.println(" noResponse pass à true ");
    	        noResponse = true;
    		}
    		catch (IOException  e) {
    			System.out.println("je suis dans le while noResponse");
    		}
     
        	}
        	 System.out.println(" response à true");
    		return response; 
        }
    le problème maintenant est que à chaque fois que je fais : InputStream iStream = myConnection.getInputStream();
    une nouvelle requête est lancé et non pas la première que je n'ai pas reçu le résultat !

  14. #14
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    Il me semble que ton problème viens du fait que tu fais le getInputStream() avant le connect(). Vu que tu as besoin d'être connecté pour récupérer le inputstream, le connect est effectué implicitement par le getInputStream();

  15. #15
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Points : 22
    Points
    22
    Par défaut
    J'ai fait connect() et j'ai toujours l'erreur, merci d'avoir répondu quand même !

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Points : 295
    Points
    295
    Par défaut
    j'ai pas vraiment d'idées sur ton problème ...

    Est ce que ton exception est récurrente?
    Si oui, peut être devrait tu regarder les fermetures de flux ?

    Est ce que tu fermes proprement chaque connexion que tu ouvres par exemple?

    Sinon est ce qu'on peut avoir la trace complète de l'exception

  17. #17
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    Je me demande si ce n'est pas le programme en face qui coupe la connexion.

    Quel est le message retourné par l'IOException?

  18. #18
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Points : 22
    Points
    22
    Par défaut
    Je suis désolé pour ce post un petit peu tard, je n'ai pas vu la deuxième page de la discussion

    voilà le message de l'exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http method GET against URL http://mycomputer/prog-bin/osform.exe/WEB?osFunction=ContenuType&parameters=do=newreply&noquote=1&p=4398368 false timed out.
    Je ne comprends pas false timed out.

    malgré que j'ai modifié mon timeout de mon serveur Apache dans \Apache2.2\conf\httpd.conf:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #
    # Timeout: The number of seconds before receives and sends time out.
    #
    Timeout 15000
    normalement :
    myConnection.getInputStream()

    doit bloquer l'appel? sinon comment le faire ça peut resoudre le problème !

  19. #19
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    C'est un problème de timeout, soit côté client, soit côté serveur.
    Sur ton objet HTTPUrlConnection, vérifie la valeur de retour des méthodes getConnectTimeout() et getReadTimeout(). Puis augmente les valeurs avec setConnectTimeout(int) et setReadTimeout(int).
    Si ça ne résout rien, alors le problème est surement coté serveur et ton application n'est pas en cause.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  20. #20
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Points : 22
    Points
    22
    Par défaut
    j'ai vérifié les méthodes getConnectTimeout() et getReadTimeout(). et elles me retournent 0 à chaque fois. de toute façon c'est normale car elle retournent 0 si on fait pas des set. et comme je ne sais pas le temps de traitement avant qu'une réponse soit dispo.


    J'ai une question sur les string qui me gène.

    J'essaie de lire le fichier qui résulte de la requête et comme mon fichier est de 5 Mo alors ça bloque je me demande est ce que une variable String est de taille limite ?

    voilà le code de lecture que j'utilise :

    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
    public static String lire (String path) 
    	{
    		BufferedReader lect ;
    		String tmp = "";
    		try
    		{
    			lect = new BufferedReader(new FileReader(path)) ;
    			while (lect.ready()==true) 
    			{
    				tmp += lect.readLine() ; 
    			}//while
    		}//try
    		catch (NullPointerException a)
    		{
    			System.out.println("Erreur : pointeur null");
    		}
    		catch (IOException a) 
    		{
    			System.out.println("Problème d'IO");
    		}
    		return tmp;
    	}//lecture

Discussions similaires

  1. [Video] OpenCV arrive à lire une vidéo AVI mais pas une autre
    Par Monsieur Griboux dans le forum Multimédia
    Réponses: 3
    Dernier message: 07/05/2016, 18h46
  2. Réponses: 3
    Dernier message: 04/08/2010, 14h05
  3. Empêcher la tabulation tant que la TextBox n'est pas saisie
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/07/2010, 22h14
  4. Lire un MP3 mais empêcher son téléchargement ?
    Par lepec dans le forum Apache
    Réponses: 1
    Dernier message: 19/07/2007, 20h31
  5. [HTML,CSS]Menu, lien.. lire svp je ne sais pas comment expliquer
    Par keishah dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 17/08/2006, 11h05

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