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 :

Problème de flux avec un socket


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Points : 92
    Points
    92
    Par défaut Problème de flux avec un socket
    Bonjour à tous,
    Dans un exercice pour l’école, il m’a été demandé de créer un socket sérialiser de flux d’entrée / sortie d’objet.
    Code fourni par le prof.
    Les flux d'entrée/sortie avec des objets
    Pour envoyer un message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     OutputStream os=socket.getOutputStream(); 
     
     ObjectOutputStream out= new ObjetcOutputStream(os); 
     
     out.writeObject(message);   out.flush(); 
     
     out.close();  os.close();
    Pour recevoir un message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     InputStream is= socket.getInputStream(); 
     
     ObjectInputStream in= new ObjectInputStream(is); 
     
     Message message= (Message)in.readObject(); 
     
     in.close();  is.close();
    Logique de l’exercice

    Coté client

    Création du message -- Connexion au serveur -- envoi du message -- réception de la réponse tous en boucle

    Coté serveur

    Mise en attente de connexion -- réception du message -- traitement du message -- envoi réponse le tous en boucle

    J’ai implémenté cette logique du coté client et du coté serveur.

    Quand je démarre le serveur il se met en attente de connexion tous ok.
    Quand je démarre le client il crée bien le message, crée la connexion et envoi le message tous est ok.
    Le problème est que une fois le message reçu coté serveur il ne fait plus la partie traitement et renvoi du message. IL se remet en attente.
    J’ai remarqué ceci car j’ai mis des sortie console avec du texte qui me disais l’opération à faire.
    C'est comme si il ne fais pas la suite des opération et il se remet on mode accept.

    voici le code coté 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
    33
    34
    35
    36
    37
    38
    39
    40
    public class TCPClient {
     
        /**
         * @param args the command line arguments
         */
        InputStream is = null;
        ObjectInputStream in = null;
        OutputStream os = null;
        ObjectOutputStream out = null;
     
        public TCPClient(Message msg){
          while(true){
            try{
                Socket connectionSocket = new Socket("localhost",6789);
     
                os=connectionSocket.getOutputStream(); 
                out= new ObjectOutputStream(os); 
                out.writeObject(msg); 
                System.out.println("Envoi du message au serveur");
                out.flush();
     
                is= connectionSocket.getInputStream(); 
                in= new ObjectInputStream(is); 
                Message message= (Message)in.readObject();
                System.out.println("reception du message du serveur");
                TraitementMessage.run(message);
            }catch(Exception e){
                e.getMessage();
            }finally{
                try{
                    in.close();
                    is.close();
                    out.close();  
                    os.close(); 
                }catch(Exception e){
                   e.getMessage(); 
                }
            }
          }
        }
    voici le code coté 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    public class TCPServer {
     
     
    //    public void main(String[] args) throws IOException {
            String clientSentence;
            String capitalizedSentence;
            int port = 6789;
            InputStream is = null;
            ObjectInputStream in = null;
            OutputStream os = null;
            ObjectOutputStream out = null;
     
            public TCPServer(){
                while(true){
                    try {
                        // se met en mode attente de connexion
                        ServerSocket srvSocket = new ServerSocket(this.getPort());
                        System.out.println("serveur en attente");
                        Socket connectionSocket = srvSocket.accept();
     
                        // récupère le message
                        System.out.println("serveur receptionne le message client");
                        is= connectionSocket.getInputStream(); 
                        in= new ObjectInputStream(is); 
                        Message message = (Message)in.readObject();
     
    //                    System.out.print(message);
                        TraitementMessage.run(message);
     
                        os=connectionSocket.getOutputStream(); 
                        out= new ObjectOutputStream(os); 
                        out.writeObject(message);  
                        System.out.println("serveur envoi la reponse au client");
                        out.flush(); 
     
                    } catch (Exception e) {
                        e.getMessage();
                    }finally{
                        try{
                            in.close();
                            is.close();
                            out.close();  
                            os.close(); 
                        }catch(Exception e){
                           e.getMessage(); 
                        }
     
                    }                
                }
     
     
            }
    Je vous remercie pour toute l’aide que vous pourrez m’apporter, dans l’attente de vos proposition je vous souhaite une bonne journée

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Le problème a plutôt l'air d'être dans TraitementMessage.run()
    On peut le voir ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Points : 92
    Points
    92
    Par défaut
    voici comme demander la classe traitementMessage
    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
    public class TraitementMessage {
        Message message;
     
    //    public TraitementMessage(Message msg){
    //        this.message = msg;
    //    }
     
        public static void run(Message msg){
            int operation = msg.getOperation();
            switch(operation){
                //Liste des clients
                case 1:
                    System.out.println("server: traitement message");
                    Client cli =  msg.getPara_client();
                    msg.setOperation(0);
                    msg.setMessage("Le nom du client :" + cli.getNom().toUpperCase() + "\nLe prenom du client" + cli.getPrenom().toUpperCase());
                    break;
                case 2:
                    break;
                case 3:
                    break;
                case 4:
                    break;
                case 5:
                    break;
                case 6:
                    break;
            }
        }
    je voulais juste rebondir si on regarde dans le code TCPserver apès avoir recuperer le message et juste avant de faire le traitement j'ai mis une sorti console avec le texte traitement du message mais le texte ne s'affiche pas comme si il m'execute pas le code.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Moi j'ai pas de problème avec le code montré, mais il y a peut-être des blocages dans le code pas montré.

    Mais tes explications ne nous aident pas : quel texte, où, et quand ? Nous n'allons pas le deviner. Montre exactement ce que tu as et d'où ça vient. On doit pouvoir te suivre à la moindre ligne de code.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Points : 92
    Points
    92
    Par défaut
    Je vais essayer de faire clair,

    Pour pouvoir suivre mon flux entre l'application client et l'application serveur j'ai mis des System.out.println pour afficher dans ma console ou il se site le traitement.

    voici ou se situe ses affichages:

    Je démarre l’application serveur et il se mets en écoute et affiche « serveur en attente »

    Je démarre l’application client et j'affiche « démarrage »

    Quandle client envoie le message, il affiche « envoi du message »

    quand le serveur réceptionne le message, il affiche « le serveur réceptionne le message »

    quand le serveur fait le traitement du message, il affiche « traitement en cours »

    quand le serveur renvoi la réponse dans le message, il affiche « serveur envoi la réponse au client »

    quand le client réceptionne le message de réponse il affiche « réception du message du serveur »

    tous ces traitement sont fait dans un while pour pouvoir communiquer


    pour la partie envoi et réception de flux sérialiser le code while se trouve pour le client dans TCPClient et pour le serveur dans dans TCPserveur.

    La partie création et décodification du message qui transite dans le flux, le traitement se fais dans la classe TraitementMessage.java avec la methode create() pour créer un message à envoyer au serveur et la methode run() pour lancer l’exécution de décodification et les renvoyer dans les classe métier pour traitement.

    La partie message et le protocole utiliser pour communiquer, elle est dans Message.java.

    Ci dessus une description textuelle de mon projet.

    Voilà ce qui s’affiche en boucle sur les consoles de mon serveur et de mon client .
    Maintenant je démarre mon serveur
    run:
    srv :serveur en attente
    Démarrage du client
    run:
    cli emmarage
    cli :Envoi du message au serveur
    srv :serveur receptionne le message client
    srv :serveur en attente


    Tout ce passe bien jusqu’à la réception du message sur le serveur
    ensuite le reste du traitement ne s’effectue plus du fait que le reste des messages ajouter dans le code ne s’affiche pas.
    C'est justement ceci que je ne comprends pas.

    C’est comme si dans ma Classe TCPServeur dans ma boucle while: le serveur se met en écoute, il réceptionne le message,
    arrete le traitement du reste du code et se remet en mode ecoute.
    Pour le client idem, il envoie le message, mais n'attend pour la recuperation du message du serveur. Le serveur se remet en ecoute et le client renvoi un message.

    C'est juste incompréhensible, est ce que le flux s'arrete au moment ou il est receptionner coté serveur et il se remet en attente. Je ne sais plus

    Mais voici le reste de mes classes

    Classe Message identique des 2 côté Message.java
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package protocoles;
     
    import java.io.Serializable;
    import java.util.List;
    import java.util.StringTokenizer;
    import modeles.*;
    import org.json.simple.JSONObject;
    import sun.org.mozilla.javascript.internal.json.JsonParser;
     
    /**
     *
     * @author michael.diblasio
     */
    public class Message  implements Serializable{
     
        private String message;
        private int operation;
        private Client para_client;
        private Compte para_compte;
     
     
        public Message(){
    //       this.message = _s;
        }
     
        public int getOperation() {
            return operation;
        }
     
        public void setOperation(int operation) {
            this.operation = operation;
        }
     
        public Client getPara_client() {
            return para_client;
        }
     
        public void setPara_client(Client para_client) {
            this.para_client = para_client;
        }
     
        public Compte getPara_compte() {
            return para_compte;
        }
     
        public void setPara_compte(Compte para_compte) {
            this.para_compte = para_compte;
        }
     
        public String getMessage() {
            return message;
        }
     
        public void setMessage(String message) {
            this.message = message;
        }
     
     
    }
    Classe traitementMessage coté client TraitementMessage.java
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package programme;
     
    import modeles.Client;
    import protocoles.Message;
     
    /**
     *
     * @author michael.diblasio
     */
    public class TraitementMessage {
     
        public static void run(Message msg){
            switch(msg.getOperation()){
                case 0:
                //Liste des clients
                    System.out.println("Reponse: Le client a bin été mis en majuscule");
                case 1:
                    Client cli =  msg.getPara_client();
                    msg.setOperation(0);
                    msg.setMessage("Le nom du client :" + cli.getNom().toUpperCase() + "\nLe prenom du client" + cli.getPrenom().toUpperCase());
                    break;
                case 2:
                    break;
                case 3:
                    break;
                case 4:
                    break;
                case 5:
                    break;
                case 6:
                    break;
            }
        }
        public static void create(int operation, Client cli){
            Message msg = new Message();
            switch((operation)){
                case 0:
                //Liste des clients
                    System.out.println("Reponse: Le client a bin été mis en majuscule");
                case 1:
                    msg.setOperation(operation);
                    msg.setPara_client(cli);
                    new TCPClient(msg);
                    break;
                case 2:
                    break;
                case 3:
                    break;
                case 4:
                    break;
                case 5:
                    break;
                case 6:
                    break;
            } 
        }
    }
    Classe traitementMessage coté serveur TraitementMessage.java
    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
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package programme;
     
    import modeles.Client;
    import protocoles.Message;
     
    /**
     *
     * @author michael.diblasio
     */
    public class TraitementMessage {
        Message message;
     
    //    public TraitementMessage(Message msg){
    //        this.message = msg;
    //    }
     
        public static void run(Message msg){
            int operation = msg.getOperation();
            switch(operation){
                //Liste des clients
                case 1:
                    System.out.println("server: traitement message");
                    Client cli =  msg.getPara_client();
                    msg.setOperation(0);
                    msg.setMessage("Le nom du client :" + cli.getNom().toUpperCase() + "\nLe prenom du client" + cli.getPrenom().toUpperCase());
                    break;
                case 2:
                    break;
                case 3:
                    break;
                case 4:
                    break;
                case 5:
                    break;
                case 6:
                    break;
            }
        }
    }
    Classe Main coté client Application.java
    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
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package programme;
     
    import modeles.Client;
     
    /**
     *
     * @author michael.diblasio
     */
    public class Application {
     
        private Application(){
        }
     
     
        private void run(){
            System.out.println("Demmarage");
            Client cli = new Client();
            cli.setNom("titi");
            cli.setPrenom("toto");
            cli.setAdresse("Rue du pond 12");
            cli.setVille("Neuchatel");
            TraitementMessage.create(1,cli);
        }
     
        public static void main(String[] args){
            new Application().run();
        }
     
    }

    J'éspère qu'avec ces expliquation je suis plus clair, mais je reste a votre dipo pour pous d'info.

    Merci pour votre aide

    Di Blasio Michael

Discussions similaires

  1. Problème de connexion avec les sockets
    Par x-programer dans le forum Objective-C
    Réponses: 0
    Dernier message: 15/01/2013, 05h22
  2. Gestion des flux avec une Socket
    Par LittleBean dans le forum Langage
    Réponses: 6
    Dernier message: 24/05/2011, 17h47
  3. Problème de récéption avec les sockets Qt
    Par Sleeping Lionheart dans le forum Qt
    Réponses: 16
    Dernier message: 18/06/2009, 21h20
  4. [FLASH MX2004] [XMLSocket] Problème avec serveur socket php
    Par cocodunombril dans le forum Flash
    Réponses: 4
    Dernier message: 03/04/2009, 02h10
  5. Problème de lecture avec les Socket
    Par Kevin12 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 18/03/2009, 15h40

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