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 :

[Reseau] Dialogue client-serveur


Sujet :

Entrée/Sortie Java

  1. #1
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut [Reseau] Dialogue client-serveur
    Bonjour

    Je débute en programmation réseau en Java. J'ai un petit problème au niveau du dialogue entre le client et le serveur.

    Le client doit envoyer un message au serveur et le serveur renvoyer ce message au client.
    Le problème c'est que le serveur reçoit bien le message du client mais ensuite, n'arrive pas à l'envoyer. En fait, le serveur n'arrive pas à envoyer de message au client ou alors le client n'arrive pas à recevoir, je ne sais pas.

    Voila les codes.

    Client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    new Treatment(csock); // thread de reception
    et Treatment est ainsi :
    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
    class Treatment implements Runnable{
     
          Socket client ;
     
          public Treatment(Socket client){
             this.client = client ;
             Thread _t = new Thread(this);
             _t.start() ;
          }
     
     
     
          private String receiveData(Socket csock) throws IOException{
            BufferedReader buf = new BufferedReader(new InputStreamReader(csock.getInputStream()));
             return (String)buf.readLine();
          }
     
          public void run(){
                 String msg ;
          try{
             do {
             msg = receiveData(this.client);
             System.out.println(msg);
             }while(!msg.equals("stop"));
     
              System.out.println("stoppp");
     
             }catch(IOException ioe){
              System.out.println("Erreur a l'envoi... " + ioe.getMessage());
             }
          }
     
    }
    Donc côté client, la réception se fait dans un thread à part.

    Serveur :

    Maintenant, côté 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
    class Treatment implements Runnable{
     
          Socket client ;
     
          public Treatment(Socket client){
             this.client = client ;
             Thread _t = new Thread(this);
             _t.start() ;
          }
     
          private void sendData(Socket csock, String msg) throws IOException{
            BufferedOutputStream bos = new BufferedOutputStream(
                            csock.getOutputStream());
            PrintWriter os = new PrintWriter(bos, false);
            os.println(msg);
            os.flush();
          }
     
          private String receiveData(Socket csock) throws IOException{
            BufferedReader buf = new BufferedReader(new InputStreamReader(csock.getInputStream()));
             return (String)buf.readLine();
          }
     
          public void run(){
          try{
              String msg ;
             sendData(this.client, "Bonjour au client");
             do {
             msg = receiveData(this.client);
             System.out.println(msg);
             sendData(this.client, msg);
             }while(!msg.equals("stop"));
     
             sendData(this.client, "Connection stopped");
     
             }catch(IOException ioe){
              System.out.println("Erreur a l'envoi... " + ioe.getMessage());
             }
          }
     
    }
    Côté serveur, tout se passe dans le thread (envoie+réception).
    Comme vous le voyez, j'utilise exactement le même code pour le client et le serveur.
    Et pourtant :

    - le serveur recoit bien mais n'envoie pas (ou alors le client ne reçoit pas)
    - le client envoie bien mais ne reçoit pas (ou le serveur n'envoie pas).

    Merci

    Nas'

  2. #2
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Je ne comprend plus rien...

    Pour tester, j'ai mis en commentaire la partie reception du serveur, c'est-à-dire la boucle do-while.
    Et pourtant, quand le client envoie un message, il s'affiche côté serveur!!!!
    Comment c'est possible???

    Nas'

  3. #3
    Membre habitué Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Points : 180
    Points
    180
    Par défaut
    Hello !

    Je n'ai pas vraiment eu le temps de regarder en détails, mais c'est vrai que c'est bizarre. J'ai juste 2-3 conseils à te donner : par exemple, crée tes streams sur le socket à l'ouverture de celui-ci, au lieu de les recréer à chaque échange. Il y avait eu un post où c'était ça qui posait problème.

    Ensuite, il me semble que ton client a plus l'air d'un serveur que ton serveur ! Je m'explique : généralement, le serveur écoute sur un port. Ensuite, il accepte une connexion et, si besoin est, effectue quelques échanges d'infos puis se mets en écoute (boucle while).

    Du côté du client, il n'y a pas du tout de boucle : il crée la connexion avec le serveur, lui envoie ses infos, attends les réponses, puis lui envoie un "BYE" et ferme la connexion.

    Donc il faudrait que tu voies ce que tu veux exactement faire avec ton client, mais pour des phases de test tu peux très bien ne pas avoir du tout de boucle ! Essaie de faire juste un échange du type three-way-handshake : le client se connecte, il envoie salut au serveur, le serveur lui répond salut, le client envoie bye et quitte. Tu y verras peut-être plus clair ensuite !

  4. #4
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Merci pour ta réponse Wookai

    Je vais essayer de ne pas créer les flux d'échanges à chaque fois. C'est vrai que maintenant que tu me le dis, je vois pas pourquoi je fais ça. Je vais le faire une fois puis le passer en paramètre par la suite.

    Sinon, en fait, je suis en train de faire un logiciel du genre MSN. Ceci se fait plus facilement avec la technologie RMI mais je veux m'entrainer avec les sockets.
    Quand le client envoie un message au serveur, le serveur doit renvoyer ce message à tous les clients connectés. J'ai regardé l'excellent tutorial de Julien Défaut (http://defaut.developpez.com/tutorie.../multithread/) mais j'ai pas fait exactement comme lui.

    En fait, j'ai fait une boucle coté client car mon programme fonctionne comme ça. On se connecte et on reste connecté jusqu'à cliquer sur le bouton "Deconnecter".
    Par conséquent, je suis obligé de boucler.
    Je ne veux donc pas faire un truc du style envoyer/recevoir/deconnecter.
    Faut rester connecté en permanance, un peu comme sur IRC.

    Sinon, un programme aussi simple (envoyer/recevoir/fermer) marche bien.

    Et je viens de remarquer un autre truc en fait. Coté client, la boucle de reception est fausse. Car le message reçu n'est jamais "null" (pour en etre sur, j'ai mis un println("yop") dans al condition de null et ce n'est jamais affiché... Donc ca fait une boucle infinie...

    Et j'ai l'impression qu'il y a un problème de temporisation.
    Quand, coté serveur, j'envoie un message placé avant le code de reception, ca marche pas. Par contre, si j'enleve le code de la reception (la boucle do/while), le message est envoyé... Donc j'ai l'impression que le code d'envoie n'a pas le temps de s'exécuter qu'il passe directement à la réception....

    Merci encore

    Nas'

  5. #5
    Membre habitué Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Points : 180
    Points
    180
    Par défaut
    C'est vrai que si tu fais une application de ce genre, tu es obligé de faire deux boucles. J'ai fait quelque chose du genre dans un soft de P2P qu'on a développé l'année passée dans le cadre d'un cours réseau !

    Sinon un autre truc que je remarque maintenant, c'est que tu ne fermes nulle part ni tes streams ni ton socket ! Pas bien ...

    J'espère que tu vas t'en sortir en tous cas ! Si tu as d'autres questions, c'est avec plaisir que je m'y intéresserai !

  6. #6
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    J'ai fait quelque chose du genre dans un soft de P2P qu'on a développé l'année passée dans le cadre d'un cours réseau
    Moi c'est par plaisir

    Sinon un autre truc que je remarque maintenant, c'est que tu ne fermes nulle part ni tes streams ni ton socket ! Pas bien ...
    Justement. Si je ferme les streams ou socket, je vais devoir me reconnecter, non?
    Encore, dans les exceptions, oui j'ai oublié, j'avoue. Mais sinon, après avoir envoyé un message, si je ferme le socket, je dois me reconnecter ce que je ne veux pas. Ou alors ne parlais-tu pas de ça...

    Si tu as d'autres questions, c'est avec plaisir que je m'y intéresserai !
    Merci c'est sympa Et des questions, je pense en avoir oui

    Nas'

  7. #7
    Membre habitué Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Points : 180
    Points
    180
    Par défaut
    Pour la fermeture, je disais à la fin ! Genre il va falloir un gros try sur ta boucle (ou dedans), un catch pour gérer tout ça, et un finally pour fermer tout ce que tu as ouvert !

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    Si ca t interesse, j'avais repris le serveur du tuto du site en lui ajoutant une petite IHM.
    Et g fait le client qui va avec.
    Si tu le veux envoie moi un message privé avec ton adresse mail.
    Parce que c un peu gros pour que je mette tout le code dans le post. Mais je peux le faire si tu préfère. Mais je doute que les modo apprécie ce genre de manip.

  9. #9
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Oui, Barbu, ça m'intéresserait bien si tu pouvais me l'envoyer. Merci
    Si je n'arrive pas à résoudre mon problème, je vais peut-être me réorienter vers la techno RMI qui semble plus facile à implémenter et surtout plus adaptée au développement d'un logiciel de messagerie style MSN.

    Nas'

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    On peut toujours rêver

    si ça t'interresse j'ai eu le meme exo au arts et metiers y a deux ans.

  11. #11
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    En fait, c'est bon. J'ai réussi à faire fonctionner mon programme. C'était bien la création répétée des flux qui posait problème on dirait. Car j'ai crée les flux une seule fois et ça semble fonctionner. Donc merci wookai
    Mickey, si tu peux me l'envoyer, je prend, ca sera toujours un programme de plus à analyser et qui me fera certainement progresser
    Et merci barbu pour tes sources. Il est plus beau que le mien
    Je vais travailler mon interface graphique

    [Résolu]

    Nas'

  12. #12
    Membre habitué Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Points : 180
    Points
    180
    Par défaut
    Content pour toi !

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

Discussions similaires

  1. [TClientSocket] Dialogue client/serveur Delphi 6
    Par Hikaru dans le forum Web & réseau
    Réponses: 6
    Dernier message: 31/03/2009, 10h28
  2. [Reseau] probleme client/serveur TCP LInux
    Par jmjmjm dans le forum Réseau
    Réponses: 20
    Dernier message: 03/12/2006, 19h32
  3. [reseau] performances client/serveur
    Par orelero dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 10/05/2006, 16h36
  4. grammaire de dialogue client serveur
    Par aaronw dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 19/02/2006, 23h30
  5. Méthode de dialogue client/serveur
    Par MisterFreeze dans le forum C++
    Réponses: 3
    Dernier message: 06/01/2006, 22h31

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