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 :
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 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()); }
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
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()); }
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
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); }
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 :
(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.)
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()); }
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 ?
Partager