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

Langage Java Discussion :

Client réseau pour recevoir plusieurs lignes.


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Points : 48
    Points
    48
    Par défaut Client réseau pour recevoir plusieurs lignes.
    Bonjour à tous,

    j'ai écris un serveur avec quelques camarades de classe pour un de nos projets. Il va chercher dans une BDD et renvoie des infos.
    En fonction de la commande qu'il reçoit, plusieurs choses sont faites.

    Bref.

    Une fonction est "CHECK", elle va renvoyer la liste complète des actions (en bourse) qui sont dispo et ensuite envoyer "+30" pour dire que c'est fini, et que tout s'est bien passé.

    Quand je me connecte au serveur avec HyperTerminal, tout marche parfaitement.

    Maintenant, je dois écrire le Client, et le problème, c'est que je reçois bien toute la liste, mais je ne reçois pas le code de confirmation, et je ne peux pas renvoyer de commande. (ça ne fait plus rien.)

    Voici mon code, quelqu'un pourrait t-il me dire quel est le problème?

    Merci !!

    Philippe

    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
    import java.net.*;
     
    import java.io.*;
     
    public class EchoClient1 {
     
        public static void main(String[] args) {
     
            Socket theSocket;
            BufferedReader theInputStream;
            BufferedReader userInput;
            PrintStream theOutputStream;
            String theLine;
            String lineFromServer = "";
            String server = "localhost";
            int port = 4321;
     
            try {
                theSocket = new Socket(server, port);
                theInputStream = new BufferedReader(new InputStreamReader(theSocket.getInputStream()));
                theOutputStream = new PrintStream(theSocket.getOutputStream());
                userInput = new BufferedReader(new InputStreamReader(System.in));
     
     
                while (true)
                {
     
                    theLine = userInput.readLine();
                    if (theLine.equals("."))
                        break;
     
                    theOutputStream.println(theLine);
                    theOutputStream.flush();
                    while((lineFromServer = theInputStream.readLine()) != null)
                    	System.out.println(lineFromServer);
     
     
                }
            }
            catch (UnknownHostException e)
            {
                System.err.println("Unknown Host Exception: "+e);
            }
            catch (IOException e)
            {
                System.err.println("IO Exception: "+e);
            }
        }
     
    }

  2. #2
    Membre émérite
    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
    Points : 2 582
    Points
    2 582
    Par défaut
    Y a-t-il un retour à la ligne après le "30" ?

    ... c'est une idée comme une autre... si celle-ci ne marche pas, pourrais-tu examiner plus avant le comportement, par exemple détailler le ça ne fait plus rien ? Où en est ton programme à ce moment là ?
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Points : 48
    Points
    48
    Par défaut
    Merci pour ta réponse.

    Concernant le retour à la ligne après le code de confirmation, effectivement, il n'y était pas.
    Donc, maintenant je le reçois bien, mais je ne peux toujours rien faire une fois les informations reçues.
    En fait, le programme tourne toujours, mais je peux taper ce que je veux dans la console, rien ne se passe...

    Des idées pour voir "ce qui se passe" ??

  4. #4
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Points : 48
    Points
    48
    Par défaut
    Bon, j'ai déjà une piste je pense.
    Quand j'affiche ce que le serveur reçoit, j'ai vu qu'il recevait ma première commande, mais pas les suivantes...

  5. #5
    Membre émérite
    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
    Points : 2 582
    Points
    2 582
    Par défaut
    Pour savoir Ce Qui Se Passe, et ben plusieurs options : un debugueur, des System.out.println partout, des JUnits...

    À priori ton programme est bloqué soit sur la lecture du flux standard, soit sur la lecture de ton serveur. À partir d'où lances-tu ton programme ? Un EDI ? Une ligne de commande ? Autrement ?...
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  6. #6
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Points : 48
    Points
    48
    Par défaut
    Je lance le programme à partir d'Eclipse.

    Quand j'ajoute un System.out après ma boucle, "J'ai fini" ne s'affiche pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    while((lineFromServer = theInputStream.readLine()) != null)
                    	System.out.println(lineFromServer);
     
                    System.out.println("J'ai fini");
    Ca doit être un truc tout con, genre une string qui est null... Mais bon... je sais pas trop comment faire.

  7. #7
    Membre émérite
    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
    Points : 2 582
    Points
    2 582
    Par défaut
    C'est sans doute que le serveur ne ferme pas le flux après avoir envoyé sa réponse, ou qu'il n'y a toujours pas de retour chariot à la fin de la dernière.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  8. #8
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Points : 48
    Points
    48
    Par défaut
    Pour le retour à la ligne, c'est bon maintenant, mais pour le fait de fermer le flux... Humm...

    Voici un bout du code du serveur, qui correspond à l'action effectuée une fois l'utilisateur connecté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                                        bw.write("+"+CONF_CODE_CONNECT);
                                        bw.flush();
                                        //bw.close();
                                        System.out.println("User Connected Successfully " + myIDnum);
    Si je décommente la ligne bw.close(); effectivement ça marche, mais simplement pour la première commande. A savoir que si l'utilisateur renvoie une commande, rien ne se passera. Comment faire pour "ré-ouvrir" le bufferedwriter???

    Merci

    Philippe

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Bon, en fait tu dois réagir aux événements.

    Pour ça, quand tu reçois la ligne "+30", tu dois soit terminer la connexion, soit entamer une nouvelle conversation. Est-ce que ton serveur le supporte ?

    Le readLine() ne renverra de null que lorsque la communication sera fermée. En attendant, tu bloques sur le serveur qui est ouvert.

    Tu dois donc analyser le flux en permanence et répondre quand il le faut.

    En fait, là, tu est dans un deadlock de tcp : ton serveur attend que tu envoies une réponse et ton client attend une réponse de ton serveur. L'un des deux doit y faire quelque chose. Dans ce cas-ci, le client.

  10. #10
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Points : 48
    Points
    48
    Par défaut
    Oui, mais il doit faire quoi exactement???

    Parce qu'en l'occurence, avec le code actuel (c'est à dire sans le close), je me connecte (et donc reçoit la réponse "+10"), mais après, quand je lance un "CHECK", je n'ai rien. Rien du tout. Et ca ne fait rien non plus du côté serveur.

    Et le message "J'ai fini" du client ne s'affiche pas.

  11. #11
    Membre émérite
    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
    Points : 2 582
    Points
    2 582
    Par défaut
    l faut que tu inventes un protocole pour ton besoin, c'est à dire que, pour chaque événement dont tu as besoin, et dont tu dois faire la liste, tu conviennes d'un rapport précis entre client et serveur. Par ex. sur la fin d'une requête, faut-il fermer le flux et le réouvrir ensuite, ou que le serveur ne renvoye "OK" seulement ? ou sur un CHECK faut-il mettre un retour chariot ? Etc.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  12. #12
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Points : 48
    Points
    48
    Par défaut
    Je te remercie pour tous tes conseils.
    En fait, nous avons déjà défini un protocole pour nos communications, mais l'erreur était dans mon client.

    Toutes les données sont envoyées, puis suivies d'un "+" suivi du code.

    Au lieu de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while((lineFromServer = theInputStream.readLine()) != null)
                    	System.out.println(lineFromServer);
    J'ai fait ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(!(lineFromServer = theInputStream.readLine()).startsWith("+"))
                    	System.out.println(lineFromServer);
     
                    // I read the last received line, which starts with a "+"
                    lastCodeReceived = lineFromServer;
    Sachant qu'aucune des données reçues ne commencera par "+", ça marche parfaitement (Pour l'instant !)

    Merci encore !

    Philippe

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

Discussions similaires

  1. Algo pour rapprocher plusieurs lignes
    Par bibi5883 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/02/2009, 15h18
  2. Problème pour effacer plusieurs lignes dans grid DevExpress
    Par Cazaux-Moutou-Philippe dans le forum Langage
    Réponses: 0
    Dernier message: 08/02/2008, 13h41
  3. Une requête pour éditer plusieurs lignes.
    Par Anduriel dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/05/2006, 20h24
  4. [C#] Un composant pour afficher plusieurs lignes ?
    Par Tips dans le forum Windows Forms
    Réponses: 3
    Dernier message: 26/12/2005, 19h47
  5. [Indy] Client-serveur pour recevoir des flux videos
    Par Nicodemus dans le forum Web & réseau
    Réponses: 7
    Dernier message: 10/10/2005, 14h18

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