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

Collection et Stream Java Discussion :

Perte de flux / Stream


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Par défaut Perte de flux / Stream
    Bonjour,

    Voici le bloc de code que j'utilise pour parcourir une HashMap et afficher ses éléments.
    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
     
    if(command2==null && options.contains("e"))
                         {
                            sortie.println("Exceptions triggered the last minute: ");
                            //Lire la HashMap ligne par ligne et obtenir la valeur pour la clé de chaque HashMap
                            Set cles = ans.exceptions.keySet();
                            Iterator it = cles.iterator();
                            //on parcours cet array
                            //System.out.println("Size of Exceptions: "+ans.exceptions.size());
                            sortie.println("Size of Exceptions: "+ans.exceptions.size()+"keyset: "+cles.size());
                            while (it.hasNext())
                            {
                                System.out.println(it);
                                Object cle = it.next(); 
                                Object valeur = ans.exceptions.get(cle);
     
                                System.out.println("DB: "+cle);
                                sortie.println("DB: "+cle);
                                System.out.println(" Exception: "+valeur);
                                sortie.println(" Exception: "+valeur);
                            }
                            sortie.println("Hop !");
                            System.out.println("Hop !");
                            sortie.println("\n");
                         }
    L'objet "exceptions" contient en clé, le nom d'une base de donnée, et en valeur l'exception levée pour cette DB, lors de la connexion à la base.

    Donc là mon but est d'afficher tout ce qu'il y a dans "exceptions"

    Voici ce qui est affiché par les System.out.println (côté serveur):
    DB: DB1
    Exception: java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
    DB: DB2
    Exception: java.sql.SQLException: ORA-01034: ORACLE not available
    ORA-27101: shared memory realm does not exist
    SVR4 Error: 2: No such file or directory

    DB: DB3
    Exception: java.sql.SQLException: Io exception: Connection refused
    DB: DB4
    Exception: java.sql.SQLException: Io exception: Connection refused
    DB: DB5
    Exception: java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
    DB: DB6
    Exception: java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
    DB: DB7
    Exception: java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
    DB: DB8
    Exception: java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
    DB: DB9
    Exception: java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
    DB: DB10
    Exception: java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
    DB: DB11
    Exception: java.sql.SQLException: ORA-01034: ORACLE not available
    ORA-27101: shared memory realm does not exist
    SVR4 Error: 2: No such file or directory

    ...
    Et voici ce qui est displayé côté client avec les sortie.println:
    Exceptions triggered the last minute:
    DB: DB1
    Exception: java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
    DB: DB2
    Exception: java.sql.SQLException: ORA-01034: ORACLE not available
    ORA-27101: shared memory realm does not exist
    SVR4 Error: 2: No such file or directory
    Connexion closed...
    En gros, le serveur envoie sur le flux les deux premières erreurs/exceptions, puis, plus rien, perte du flux...

    Voici côté client comment je lis le flux:
    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
     
    else if(options!=null && options.contains("e"))
                        {
                            String message = args[0];
                            sortie.println(message);
                            do 
                            {
                                reponseDuServeur = entreeDepuisServeur.readLine();
                                if(reponseDuServeur.isEmpty()==false)
                                {    
                                    System.out.println(reponseDuServeur);
                                }
                            }
                            while(reponseDuServeur.isEmpty()==false);
     
                        }
    (je pense que le code n'est pas difficile à décrypter...)

    Vous avez une idée du pourquoi qu'j'ai pas un affichage complet côté client ?

    J'ai essayé en faisant un affichage sur le flux de sortie (côté serveur) de le String "plop", juste à la fin de ma boucle while, et juste au début... et rien ne s'affiche lorsque le flux est perdu ('fin, perdu, je suppose quoi...)

    Oukélé mon erreur ?

    D'avance merci.
    Bien à vous.

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Peut être fermes-tu trop tôt ton flux coté serveur, sans attendre que le client ait tout lu.

    Comment envoies-tu les données coté serveur ?

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Par défaut
    Bonjour, merci de répondre ^^

    Le code côté serveur est le premier bloc de code que j'ai collé en haut de mon premier post...

    Comme tu vois, je ne sors de la boucle qu'une fois que j'ai parcouru tout l'itérateur.

    Bon maintenant je ne sais pas si ça peut t'aider, mais je peux te montrer le minuscule code qui me permet de récupérer le contenu de ma hashmap "Exceptions" dans mon objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public String getExceptions(String db_name)
    {
            return (String)exceptions.get(db_name);
    }
    Je vais essayer de te montrer la structure de ma classe principale côté serveur, celle par laquelle transitent les données, celle que le client consulte et qui redirige les données vers le client, celle qui fait "interface" quoi...

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    public static void main(String[] args) 
      {
        //je t'épargne les déclarations de variables et autres tests inutiles pour l'explication  
        try 
        {
          ServerSocket service = new ServerSocket(9000); //On crée le Socket
          .
          .
          .
          if(flag==false)
              {
                  if(args.length>0 && options2.contains("l"))
                  {
                      log = true;
                  }
                  threadCo = new ThreadConnexion(verbose,log); //on instancie l'objet qui fait les traitements
                  threadCo.start();
     
                  //Une fois les threads démarrés, ServeurThread attend les requêtes clients, au besoin on questionnera l'objet
                  //et formatera la réponse (pour une meilleure lisibilité) qu'il enverra sur le flux de sortie pour l'afficher
                  //côté client.
                  while (true) //boucle infinie
                  {
                        Socket connexion = service.accept();
                        //une fois la requête reçue on crée les flux
                        BufferedReader entree = new BufferedReader(new InputStreamReader(connexion.getInputStream()));
                        PrintWriter sortie=new PrintWriter(connexion.getOutputStream(), true);
                        //on stock la requête (la commande envoyée côté client)
                        str=entree.readLine();
                        if(command2==null && options.contains("e"))
                         {
                            sortie.println("Exceptions triggered the last minute: ");
                            //Lire la HashMap ligne par ligne et obtenir la valeur pour la clé de chaque HashMap
                            Set cles = ans.exceptions.keySet();
                            Iterator it = cles.iterator();
                            //on parcours cet array
                            //System.out.println("Size of Exceptions: "+ans.exceptions.size());
                            sortie.println("Size of Exceptions: "+ans.exceptions.size()+"keyset: "+cles.size());
                            while (it.hasNext())
                            {
                                System.out.println(it);
                                Object cle = it.next(); 
                                //cle.toString();
                                Object valeur = ans.getExceptions(cle.toString());
                                //Object valeur = ans.exceptions.get(cle); //getStatus(cle);
                                //on rempli l'array avec les valeur pour les clé...
     
                                System.out.println("DB: "+cle);
                                sortie.println("DB: "+cle);
                                System.out.println(" Exception: "+valeur);
                                sortie.println(" Exception: "+valeur.toString());
                            }
                            sortie.println("Hop !");
                            System.out.println("Hop !");
                            //Le flux est pourri dés la 3èe itération, dés qu'on commence à avoir des "login timeout"
                            sortie.println("\n");
                         }
                         if(command2!=null && options.contains("s") && flag3==true)
                         {
                           ...
                         }
                         if(options.contains("u"))
                        {
                           ...
                        }
                        else if(options.contains("s") && command2==null) 
                        {
                        }
    //Puis tout une série de "else if"...
    }
        catch (IOException e) 
        { 
        	System.err.println("INIT:"+e);
            System.out.println("");
        }
     
      }
    Voilà. Je ne sais pas si tu as assez d'éléments pour pouvoir m'aider à avancer...

    Merci d'essayer en tout cas.
    Bien à toi.

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Ce qui me gène là dedans, c'est que je ne vois nulle part la fermeture du flux de sortie, ou de la socket. Est-ce que tu ne l'as pas recopié ? Qui ferme la socket, et / ou la sortie, et sur quel événement le fait-il ?

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Par défaut
    Effectivement je ne ferme jamais le flux de sortie.

    Je termine juste son envoie par le '\n'.

    Et je ne ferme jamais non plus la socket. Mais bon, comme ce programme est en fait un programme de monitoring de bases de données, il est censé tourner 24/7, donc je m'étais dit que ce n'était pas la peine de fermer ni la socket, ni le flux, juste parfois faire un flush du flux.

    En fait, c'est sûrement mal codé de ma part, mais ça fonctionne pour toutes les autres options (arguments en ligne de commande) de mon programme. Juste que là avec les exceptions, je consulte une hashmap (une de plus, et avec les autres j'ai pas de problème) et le flux refuse d'envoyer les lignes vers le client

    Si ça peut t'aider je peux t'envoyer mes sources, mais ce serait en privé... et je rédigerais la solution en public, dans ce thread.

    EDIT: Bon j'ai testé avec fermeture de flux, et ça n'arrange pas les choses...

  6. #6
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Je suis peut être parti dans la mauvaise direction. Mais si tu ne fermes pas la sortie, d'où vient le Connexion closed... que l'on voit sur les traces coté client ?

    S'il se confirme que tu ne fermes jamais la sortie ou la socket, le problème ne vient pas de là, même si ce n'est pas très propre.

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

Discussions similaires

  1. perte de flux dans un div
    Par greg2smec dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 01/11/2010, 17h34
  2. Rech code pour lire flux stream camera IP DCS 950 DLink
    Par altair8080 dans le forum Visual C++
    Réponses: 5
    Dernier message: 01/02/2010, 14h57
  3. WebBrowser WPF avec flux/stream PDF
    Par jfpacory dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 04/06/2009, 09h56
  4. Choix de technologies serveurs pour flux streaming bidirectionnels
    Par LorisB dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 06/05/2009, 18h47
  5. Réponses: 1
    Dernier message: 15/06/2007, 16h39

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