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 :

BufferedReader/Writer : problème de base


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    Architecte cybersécurité
    Inscrit en
    Avril 2014
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte cybersécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 566
    Par défaut BufferedReader/Writer : problème de base
    Bonjour voila j'ai un peu cherché sur les pages d'oracle il y a quelque chose que je n'ai pas du saisir : Il s'agit simplement d'un code tout simple d'un client et d'un serveur
    monothreadé mais je bute un peu sur les appels à read et write :

    code du serveur :

    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
     
    import java.net.*;
    import java.io.*;
     
     
    public class Serveur {
     
    	public static void main(String args[]) throws IOException{
     
    	ServerSocket serveur = new ServerSocket(11114);
     
    	do{
    		Socket service = serveur.accept();
     
    		BufferedReader in = new BufferedReader( new InputStreamReader( service.getInputStream()));
    		BufferedWriter out = new BufferedWriter( new OutputStreamWriter( service.getOutputStream()));
     
    		String messageRecu;
     
    		while((messageRecu = in.readLine())!=null)
    			System.out.println( messageRecu );
     
    		//out.write("message du serveur pour le client");
    		//out.flush();
     
    		in.close();
    		out.close();
    		service.close();
    	}while(true);
     
    	}
    }
    et voici le code du Client :

    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
     
    import java.io.*;
    import java.net.*;
     
    public class Client{
     
    	public static void main(String args[]) throws IOException{
     
    	Socket service = new Socket("localhost",11114);
     
    	BufferedWriter out = new BufferedWriter( new OutputStreamWriter(service.getOutputStream()));
    	BufferedReader in = new BufferedReader( new InputStreamReader( service.getInputStream()));
     
     
    	out.write("message du client pour le serveur");
    	out.flush();
     
     
    	//String messageRecu;
    	//while((messageRecu = in.readLine())!=null)
    		//System.out.println(messageRecu);
     
     
    	out.close();
    	in.close();
    	service.close();
     
    	}
     
     
     
    }
    Ca marche bien et le message est bien envoyé au serveur.
    Mais si j'enleve les commentaires, la le serveur et le client reste planté surement en attente de quelque chose.
    Donc j'arrive a faire un envoie de donnée ( String) par le client mais je n'arrive pas a faire repondre le serveur juste apres qu il ai recu des données du client.
    J'ai lu que read et write etaient bloquant mais la je ne vois pas le rapport.

    D'autre part une fois le programme terminé, si je relance le serveur java m'indique que le port est utilisé.
    J'aurais bien mis un serveur.close() mais si je le met apres la boucle, java me dit que l'instruction n'est jamais atteinte.

    Enfin bref merci pour votre aide.

  2. #2
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 341
    Par défaut
    Bonjour,

    sans trop rentrer dans le détail de fonctionnement, je dirai que votre code manque un peu de "Try / Catch / Finally".
    Voici un exemple de structure de code que j'utilise pour télécharger des données en protocole FTP:
    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
    byte [] tampon = new byte[ Util.DEFAULT_COPY_BUFFER_SIZE ];
    int octets_lus = -1;
    int total_octets_lus = 0;
     
    try
    {
      OutputStream fluxFichier = Files.newOutputStream( cheminTemporaire );
      InputStream fluxImport = clientFtp.retrieveFileStream( sFichier );
     
      // Transfert de fichier
      while(( octets_lus = fluxImport.read( tampon )) != -1 )
      {
        fluxFichier.write( tampon, 0, octets_lus );
        total_octets_lus += octets_lus;
      }
    }
    catch( Exception e )
    {
      /.../
    }
     
    // Fermeture des flux avant interruption connexion:
    try
    {
      if( fluxFichier != null )
      {
        fluxFichier.flush();
        fluxFichier.close();
      }
    }
    catch( IOException ioE )
    {
      /.../
    }
     
    try
    {
      if( fluxImport != null )
        fluxImport.close();
     
    }
    catch( IOException ioE )
    {
      /.../
    }
    Entourez les codes à risque par des Try/Catch et vous verrez peut être une levée d'exception sur le code en défaut. Cela vous permettra des cibler le bogue.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Bien sûr que non puisqu'il n'a pas d'Exception. S'il en avait il les verrait -_-°.

    Le problème c'est que le client essaie de lire quelque chose alors que le serveur ne lui envoie rien. Si le serveur fermait la socket le client se rendrait compte qu'il n'y a rien à lire et s'arrêterait là. Mais le serveur ne ferme la socket qu'après avoir lu tout ce que le client a envoyé. C'est à dire jusqu'à ce que le client ferme la socket. Autrement dit les deux attendent que l'autre ferme la socket, et donc ça n'arrive pas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre émérite
    Homme Profil pro
    Architecte cybersécurité
    Inscrit en
    Avril 2014
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte cybersécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 566
    Par défaut
    Tout d'abord merci de vos réponses je suis débutant dans ce domaine c'est plutot difficile quand on y connait pas grand chose.

    Oui il est vrai que c'est simplement une attente je n'ai pas de problème d'exceptions.

    Je n'ai pas tout à fait saisi en fait le client émet un message puis lis la réponse du serveur.donc il reste en bloquant au moment de readLine();
    Le serveur se met en bloquant avec readLine(), recoit la trame du client donc se débloque puis écrit dans le flux.. Il ne devrait donc pas être bloqué si?
    et puisque le serveur a écrit dans le flux, le client devrait lire la trame puis se débloqué non?
    et en dernier lieu fermeture des sockets.

    A moins qu'une socket ne serve qu'à envoyer qu'une seule trame de données à la fois?et c'est donc pour ca que tu me dis que chacun attend que la socket de l'autre se ferme?

    En tout cas merci.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Comment est-ce qu'une boucle while() pourrait correspondre à "lire une trame" ? Bien évidemment elle fait exactement ce que tu lui dis de faire : lire absolument tout jusqu'à ce que la connexion se termine.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre émérite
    Homme Profil pro
    Architecte cybersécurité
    Inscrit en
    Avril 2014
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte cybersécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 566
    Par défaut
    en fait meme si j'enleve le while et met un simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println(in.read());
    ca plante.Pourtant in.read() devrait renvoyé une valeur, -1 si il n'y a rien et le caractere en question si elle a lu quelque chose non?donc pourquoi planté la?Surtout que la socket est toujours ouverte à ce moment la.

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

Discussions similaires

  1. Problème accès base de données
    Par alainconnu dans le forum Outils
    Réponses: 3
    Dernier message: 27/04/2006, 09h31
  2. Problème de base avec Delphi
    Par Chaumel dans le forum Bases de données
    Réponses: 1
    Dernier message: 26/04/2006, 08h58
  3. Problème Update Base de données avec les composants ADO
    Par lingli dans le forum Bases de données
    Réponses: 5
    Dernier message: 20/04/2006, 00h41
  4. Problème de base MySQL avec installation de script
    Par JoN28fr dans le forum Installation
    Réponses: 3
    Dernier message: 27/10/2005, 18h34
  5. Problème connection base
    Par krfa1 dans le forum ASP
    Réponses: 5
    Dernier message: 15/09/2005, 15h58

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