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

Java Discussion :

Lecture sur DataInputStream


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 139
    Points : 35
    Points
    35
    Par défaut Lecture sur DataInputStream
    Salut à tous,

    J'ai un problème avec la ligne 'while ((bytesRead = serverIn.read(reponse)) > 0)' . En fait, il passe bien dans la boucle en lisant par bloc de 4096 octets. Quand il reste par exemple 2000 bytes et qu'il les a lu et qu'il revient dans la boucle, je remarque qu'il ne quitte pas l'entête la ligne 'while...' . Il ne va ni dans System.out.println("message lu du serveur"); ni n'engendre d'exceptions.
    Avez-vous une idée svp ?
    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
     
    InputStream inputStream = serverSocket.getInputStream();
    serverIn = new DataInputStream(new BufferedInputStream(inputStream));
    OutputStream outputStream = clientSocket.getOutputStream();
    clientOut = new DataOutputStream(new BufferedOutputStream(outputStream));
    ...
    int bytesRead;
    byte[] reponse = new byte[4096];
    String response = "";
     
    try{
    while ((bytesRead = serverIn.read(reponse)) > 0) {
    	String string = new String(reponse);
    	response += string;
     
    	clientOut.write(reponse, 0, bytesRead);
    	clientOut.flush();
    }
    }catch(Exception e){
    System.out.println(e.getMessage());
    }
    System.out.println("message lu du serveur");
    System.out.println(response);

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    read() est bloquant, et ne retournera la valeur -1 QUE si elle reçoit une fin de flux. Dans le cas d'une socket cela survient uniquement lorsque la partie opposé a fermer la socket.


    Si tu doit envoyer d'autres éléments sur la même socket, tu dois mettre en place un protocole de communication pour savoir à l'avance la quantité de donnée à lire...


    a++

    PS : Au passage le DataInputStream ne sert à rien dans ton code. Tu aurais pu faire cela directement avec l'InputStream...

  3. #3
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Citation Envoyé par dark0502 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while ((bytesRead = serverIn.read(reponse)) > 0)
    Il faut également prendre en compte la valeur 0 donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while ((bytesRead = serverIn.read(reponse)) >= 0)
    Ensuite tu crées une String à partir des octets sans utiliser d'encodage, ni même vérifier si ton tableau de byte est complet, ni vérifier si les octets lu correspondent à une chaîne entière. Rien ne garantie que les octets lu ne s'arrête pas au milieu d'un caractère.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

Discussions similaires

  1. Ecriture / Lecture sur le port parallèle
    Par steeray dans le forum Windows
    Réponses: 11
    Dernier message: 05/08/2006, 18h56
  2. FTP & lecture sur le canal de controle
    Par Tex-Twil dans le forum Modules
    Réponses: 9
    Dernier message: 15/01/2006, 12h15
  3. Erreur de lecture sur BD Access avec delphi
    Par e120650 dans le forum Bases de données
    Réponses: 1
    Dernier message: 10/06/2005, 10h17
  4. [C#] lecture sur port série
    Par Iokanaan dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/05/2005, 13h50
  5. [Kylix] Lecture sur le port série en C++
    Par MD Software dans le forum EDI
    Réponses: 1
    Dernier message: 08/05/2004, 12h52

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