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

Entrée/Sortie Java Discussion :

[Socket] Problème de lecture flux danss communication


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club Avatar de tooney
    Inscrit en
    Avril 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 54
    Points : 29
    Points
    29
    Par défaut [Socket] Problème de lecture flux danss communication
    Bonjour à tous!!!

    Voici mon problème :

    Je réalise un chat, avec donc clients / serveur. A la connexion d'un client, le serveur lui envoie un message de bienvenue sur plusieurs lignes du style :

    Serveur >>> Bienvenue sur le chat
    Serveur >>> Il y a actuellement 4 connectés
    Serveur >>> Vous n'avez pas encore de pseudo
    etc....

    Le seul problème, c'est que mon client ne reçoit pas tjs les données, et c'est complétement aléatoire. Des fois il va afficher une ligne, des fois toutes les lignes.

    Ce n'est pas un problème au niveau du serveur, car j'ai testé avec telnet, et ça marche impecc...

    Voici un extrait du code de mon client :

    Pour la réception des données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      // Recevoir les données du serveur sur la socket
      private String recevoir() {
        String texte = "";
        try {
          BufferedReader input = new BufferedReader(new InputStreamReader(this.serveur.getInputStream()));
          texte = input.readLine();
        }  
        catch (IOException e) {}
        flux.afficheFluxEntrée(texte);
        return texte;
      }

    Utilisation de la méthode recevoir() dans le Client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        while (true) {
          String données = recevoir();
          if (données != "")
            traitementDonnées(données); //Traitement des données reçues
        }
    Au début je pensais que mon traitement de données était trop long, et que l'envoi de données était trop rapide pour qu'elles soient toutes traitées par le client. Malgré tout, mon traitement est relativement restreint, et je pense qu'il est possible que ça vienne plutôt de la méthode readLine(), car j'ai lu qu'elle était deprecated...

    Quelqu'un aurait-il une solution pour moi?

  2. #2
    Membre habitué Avatar de al85
    Profil pro
    Inscrit en
    Février 2004
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 158
    Points : 128
    Points
    128
    Par défaut
    fais un flush apres chaque ecriture dans le flux pour vider le buffer et forcer l'ecriture.

  3. #3
    Membre habitué Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Points : 180
    Points
    180
    Par défaut
    Hello !

    Après vérification, readLine() n'est pas deprecated, et je l'ai souvent utilisée, il me semble pas qu'il y ait de problème avec... C'est vrai qu'un flush devrait peut-être arranger les choses, mais le problème vient peut-être du fait que tu ne fermes ni ton BufferedReader ni le InputStreamReader.

    Mais ma question est la suivante : pourquoi crées-tu un nouveau stream et un nouveau reader sur ton socket à chaque lecture, plutôt que d'en créer un à l'ouverture du socket et de garder toujours le même ? Peut-être qu'en faisant ainsi tu n'aurais pas ce problème...

  4. #4
    Nouveau membre du Club Avatar de tooney
    Inscrit en
    Avril 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 54
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par al85
    fais un flush apres chaque ecriture dans le flux pour vider le buffer et forcer l'ecriture.
    Je fais bien sûr un flush après chaque écriture dans le flux (flush automatique). J'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PrintWriter output = new PrintWriter(serveur.getOutputStream(), true);
    Je vais essayer la solution de Wookai de créer un nouveau stream uniquement à l'ouverture de la socket et je vous tiens au courant.

    DD

  5. #5
    Nouveau membre du Club Avatar de tooney
    Inscrit en
    Avril 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 54
    Points : 29
    Points
    29
    Par défaut Problème résolu!!!!
    Merci Wookai, il semblait effectivement qu'il n'aimait pas trop l'ouverture intempestive d'un nouveau reader!!! J'ai corrigé le problème comme tu me l'as suggéré, à savoir d'ouvrir le reader une seule fois à l'ouverture de la connexion, et ensuite de faire uniquement un input.readLine(), et pour l'instant pas de souci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      private void connexionServeur(String[] args) {
     
        int port;
        try {
          port = Integer.parseInt(args[1]);
          this.serveur = new Socket(args[0], port);
          output = new PrintWriter(this.serveur.getOutputStream(), true);
          input = new BufferedReader(new InputStreamReader(this.serveur.getInputStream()));
     
        }
        catch (UnknownHostException e) {}
        catch (IOException e) {}
      }
    Merci beaucoup Wookai!!!!

  6. #6
    Membre habitué Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Points : 180
    Points
    180
    Par défaut
    De rien ! Content d'avoir pu aider...

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

Discussions similaires

  1. Problème de lecture avec les Socket
    Par Kevin12 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 18/03/2009, 16h40
  2. Réponses: 4
    Dernier message: 23/11/2008, 03h05
  3. Socket - Problème de communication client/serveur
    Par Arkinou dans le forum Réseau
    Réponses: 4
    Dernier message: 31/05/2007, 16h01
  4. [Java][Socket] Pas de lecture de flux
    Par mavina dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 20/10/2006, 20h02
  5. problème lecture flux d'erreur standart
    Par youp_db dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 10/10/2006, 11h50

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