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

avec Java Discussion :

Flux dans une architecture client serveur


Sujet :

avec Java

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Flux dans une architecture client serveur
    Bonjour à tous !

    Je planche actuellement sur l'envoi sur le réseau de données cryptées.
    J'ai un client qui possède une interface graphique.
    Lorsque je clique sur ok, il envoie d'abord au serveur la méthode de cryptage en clair (le choix est proposé entre "DES" et "AES") via cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        public void sendUTF(String str) {
            try {
                dos.writeUTF(str);
                System.out.println("SEND UTF OK");
            } catch (IOException ex) {
                System.err.println("Erreur sendUTF to  : " + ex.getMessage());
            }
    Ensuite, il envoie au serveur un tableau de bytes cryptés au préalable via cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        public void sendBytes(byte[] b) {
            try {
                dos.write(b);
                dos.flush();
                dos.close();
                System.out.println("SEND BYTES OK");
            } 
            catch (IOException ex) {
                System.err.println("Exception send to  : " + ex.getMessage());
            }
    En gros, au niveau du bouton OK, ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private void but_okActionPerformed(java.awt.event.ActionEvent evt) {
        ca.sendUTF(cryptage);
        ca.sendBytes(byteTab);
    }
    Premier problème ici : je dois fermer le DataOutputStream pour que le serveur se rende compte que l'envoi est terminé ! Mais bon ça marche ! :p



    J'aimerais que le serveur (pour l'instant monothread) lise en boucle : d'abord la méthode de cryptage en clair, et ensuite le flux de bytes cryptés.

    La boucle fonctionne tant que je ne lis que de l'UTF via la méthode readUTF() du DataInputStream instancié dans ma classe 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
     
        public static void main(String[] args) {
            try {
                Serveur sc = new Serveur();
                sc.startServer();
                sc.acceptClient();
     
                String cryptage;
     
                while ((cryptage = sc.getDis().readUTF()) != null) {
     
                    System.out.println("cryptage = " + cryptage);
     
                }
            } 
            catch (IOException ex) {
     
            }

    Le problème se pose lorsque j'ajoute la lecture du flux de bytes. Mon main du Serveur devient alors :

    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
     
        public static void main(String[] args) {
            try {
                Serveur sc = new Serveur();
                sc.startServer();
                sc.acceptClient();
     
     
                String cryptage;
     
                while ((cryptage = sc.getDis().readUTF()) != null) {
     
                    System.out.println("cryptage = " + cryptage);
     
                    byte[] byteTab = null;
                    byte b;
                    try {
                        //tant qu'on reçoit des bytes, on remplit le 
                        //bytearrayoutputstream
                        while (true) {
                            b = sc.getDis().readByte();
                            sc.getBaos().write(b);
                        } 
                    } 
                    //quand on ne reçoit plus de bytes, on crée le tableau de bytes
                    //à partir du bytearrayoutputsteam
                    catch (EOFException e) {
                        byteTab = sc.getBaos().toByteArray();
                        System.out.println("Mess reçu : " + new String(byteTab));
                        System.out.println("FIN DE RECEIVEBYTES");
                    } 
                    catch (IOException e) {
                        System.err.println("IOException : " + e.getMessage());
                    }
     
                }
                sc.getBaos().close();
                sc.getDis().close();
            } 
            catch (IOException ex2) {
                System.err.println("IOException 2 : " + ex2.getMessage());
            }
    (Le message étant crypté, je ne peux pas détecter un caractère de fin de chaine, donc je dois passer par l'exception pour la détecter.)

    Deuxième problème ici : le programme catch l'exception 2 et ne "ré-attend" pas un deuxième message crypté.
    Sans doute parce que le flux est fermé au niveau du client...


    Comment puis-je m'en sortir pour que mon serveur ne s'arrête pas tant que je ne lui demande pas explicitement ?

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    avant d'envoyer ton tableau de byte, envoie sa taille, ainsi, du coté serveur tu lit d'abord la taille, et ensuite tu limite la lecture au nombre de bytes en question. Sinon le serveur a aucun moyen de savoir quand il doit arreter de lire.

    Une fois ca résolu, plus besoin de fermer le stream et donc plus de problème d'exception levée.

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Un grand merci tchize_, ça fonctionne !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/12/2009, 14h06
  2. Réponses: 1
    Dernier message: 02/08/2009, 21h55
  3. Threads dans une archirecture client serveur
    Par siimpatiico dans le forum Débuter
    Réponses: 3
    Dernier message: 07/07/2008, 16h37
  4. Réponses: 3
    Dernier message: 25/04/2008, 08h04
  5. Réponses: 1
    Dernier message: 10/09/2006, 13h02

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