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 :

[ServerSocket] Problème de bloquage sur readLine()


Sujet :

Entrée/Sortie Java

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut [ServerSocket] Problème de bloquage sur readLine()
    Bonjour à tous et merci de vous être penché sur mon problème !

    Le but de mon programme est de simuler un bouchon. Je reçois une trame d'une plate forme AIX, et je la lui renvoie telle quelle. A priori, rien de complexe !
    Pour cela, j'utilise un ServerSocket et un objet BufferedReader pour récupérer mes caractères.
    Voici la cinématique de mon problème :
    Le client ouvre une session, envoie son message, et mon programme serveur, doit répondre.
    Lorsque le serveur reçoit la trame, il ne la renvoie que lorsque le client signale sa fermeture de session pour cause de timeout.
    Visiblement, la méthode readLine() reste à attendre un caractère bien précis (de fin de ligne probablement) qui n'arrive pas dans la requête de départ du client.
    Si on fait un read() simple qui renvoie un int du premier caractère de la chaine, pas de problème, le programme continue et renvoie son caractère. Malheureusement, on ne peut pas faire de read() plusieurs fois sur le même buffer, car à la première lecture il se considère stocké et disparait (null pointer exception).

    Pouvez-vous m'aider ???


    Pour info, voici les sources du programme server :

    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
    import java.io.*;
    import java.net.*;
     
    public class bouchon {
    	public static void main(String[] args) throws Exception {
    		try {
    			ServerSocket ecoute = new ServerSocket(53986, 1);
    			Socket service = (Socket) null;
    			byte tab[]=null;
     
    			while (true) {	
    				System.out.print("\n\nEn attente...");
     
    				System.out.println("Ecoute...\n");
    				service = ecoute.accept();
     
    				System.out.println("Lecture... \n");												
    				BufferedReader plec =
    					new BufferedReader(new InputStreamReader(service.getInputStream()));
     
     
    				System.out.println("CHAINE début lecture: \n");
    				String str = new String(plec.readLine());//plec.readLine(); // lecture du message
    				System.out.println("CHAINE lue: \n" + str);
     
    				System.out.println("Ecriture... \n");
    				PrintWriter pred =
    					new PrintWriter(
    						new BufferedWriter(
    							new OutputStreamWriter(service.getOutputStream())),	true);	
     
    				StringBuffer Sb = new StringBuffer(str);			
     
    				pred.println(str); // renvoi d'un écho
    				System.out.println("Sortie ASCII : \n"+Sb.toString());
    				service.close();
    			}
    		} catch (Exception e) { 
    			System.out.println(e);// traitement d'erreur } 
    		}
    	}
    }

  2. #2
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    Par défaut
    deja, commence par utiliser les balises [code] ... les boutons qui se trouvent au dessus de la fenetre ou tu saisis ton message ne sont pas la uniquement pour decorer mais aussi pour t'aider a mettre en forme ton message.

    Pour commencer, il me semble que readLine() est deprecated ... donc evite de l'utiliser. Ensuite, tu dis que tu ne peux pas utiliser read() plusieurs fois car les donnes sont perdu ... mais il ne tiens qu'a toi de les enregistrer quelque part en attendant de les renvoyer.

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Oups désolé pour la mise en forme, j'ai cru naîvement que l'indentation du code allait rester... désolé encore; je suis tout nouveau ici !

    Ensuite, merci pour ta réponse si rapide ! Mais qu'entend tu par deprecated ? Et de plus comment enregistrer toute la chaine de caractères en une fois via le read() qui ne lit qu'un seul caractère à ma connaissance ?
    J'y avais déjà pensé, sachant qu'en plus je connais la longueur de la chaine qui m'arrive.


    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
     
    import java.io.*;
    import java.net.*;
     
    public class bouchon {
    public static void main(String[] args) throws Exception {
    try {
    ServerSocket ecoute = new ServerSocket(53986, 1);
    Socket service = (Socket) null;
    byte tab[]=null;
     
    while (true) {
    System.out.print("\n\nEn attente...");
     
    System.out.println("Ecoute...\n");
    service = ecoute.accept();
     
    System.out.println("Lecture... \n");
    BufferedReader plec =
    new BufferedReader(new InputStreamReader(service.getInputStream()));
     
     
    System.out.println("CHAINE début lecture: \n");
    String str = new String(plec.readLine());//plec.readLine(); // lecture du message
    System.out.println("CHAINE lue: \n" + str);
     
    System.out.println("Ecriture... \n");
    PrintWriter pred =
    new PrintWriter(
    new BufferedWriter(
    new OutputStreamWriter(service.getOutputStream())), true);
     
    StringBuffer Sb = new StringBuffer(str);
     
    pred.println(str); // renvoi d'un écho
    System.out.println("Sortie ASCII : \n"+Sb.toString());
    service.close();
    }
    } catch (Exception e) {
    System.out.println(e);// traitement d'erreur }
    }
    }
    }

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 59
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    Fuadrait pas faire un truc du genre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BufferedReader in = new BufferedReader(new
                                                   InputStreamReader(connection.
                    getInputStream()));
            BufferString result = new String("");
            String inputLine = in.readLine();
            while (inputLine != null) {
                result = result.append(inputLine);
                inputLine = in.readLine();
            }
            in.close();
     
            return result;

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci Kaiser !

    Mais comme mon code bloque au moment du readLine() et ce jusqu'au message de déconnection de mon client, je ne rentrerais même pas dans la bouche qui vérifie la nullité de la ligne prochaine.

    En fait, quand j'utilise un client java de ce genre :

    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 Client {
     
    	public static void main(String[] args) throws Exception {
     
    		try {
    			Socket s = new Socket("10.154.51.1", 53986);
    			BufferedReader plec =
    				new BufferedReader(
    					new InputStreamReader(s.getInputStream(), "Cp037"));
     
    			PrintWriter pred =
    				new PrintWriter(
    					new BufferedWriter(
    						new OutputStreamWriter(s.getOutputStream(), "Cp500")),
    					true);
     
    			String toto =
    				"0100d038000106808000000000000100002009000000000000000000000000000000000001010b000000000000404040404040404040404040404040400000244040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040";
     
    			System.out.println(toto);
    			pred.println(toto); // envoi d'un message
    			// OutputStream et non pas Writer 
    			System.out.println(plec.readLine()); // lecture de l'écho
    			s.close();
    		} catch (Exception e) { // Traitement d'erreur
    			System.out.println(e);
    		}
    	}
    }
    Ca marche impeccable... C'est à n'y rien comprendre ma foi...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 59
    Points : 41
    Points
    41
    Par défaut
    Bon, moi les E/S ca me saoule un peu mais le problème vient pas de la :
    pred.println(toto);
    Il y a le ln (retour a la ligne)

    Dans ta trame AIX tu ne la peut etre pas, concane peut etre dans ta chaine un \r\n.

    Enfn, j'dis p'tete une betise, je pas reveillé aujourd'hui.

  7. #7
    Candidat au Club
    Inscrit en
    Mars 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dans ta trame AIX tu ne la peut etre pas, concane peut etre dans ta chaine un \r\n.
    Malheureusement je ne suis pas maître de ce qu'envoie ma plate forme AIX, je ne peux rien lui ajouter...

  8. #8
    Candidat au Club
    Inscrit en
    Mars 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dans ta trame AIX tu ne la peut etre pas, concane peut etre dans ta chaine un \r\n.
    Malheureusement je ne suis pas maître de ce qu'envoie ma plate forme AIX, je ne peux rien lui ajouter...

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 59
    Points : 41
    Points
    41
    Par défaut
    mouais, bah essai avec read() de chopper tous les caractères de la trame en virant ton buffer pour voir ce qu'il y a a la fin

  10. #10
    Candidat au Club
    Inscrit en
    Mars 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Problème résolu
    Merci à tous, j'ai fini par trouver seul.
    il me suffisait d'utiliser la méthode read(cbuf, offset, longueur) et de me débrouiller avec le tableau de caractère. Plus simple de manipulation et plus fiable que le readLine().

  11. #11
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    Par défaut
    [Résolu]

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/07/2010, 14h37
  2. [ServerSocket]Problème communication client-serveur udp sur linux
    Par gdecrouez dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 29/09/2006, 14h59
  3. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 16h56
  4. Problème avec RDTSC sur K6-III
    Par le mage tophinus dans le forum x86 32-bits / 64-bits
    Réponses: 17
    Dernier message: 30/09/2003, 09h43
  5. problème de float sur SQL server 2000.
    Par fidji dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 24/07/2003, 14h15

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