Salut à tous,
Tout d'abord c'est mon premier post, alors je félicite les responsables de ce site pour sa qualité en général, en plus c'est en français![]()
Sinon, je suis au bord de la dépression nerveuse. Je cherche à utiliser des sockets en SSL, et y envoyer directement des objets zippés. En fait mon prog utilise une classe de message.
(Désolé si je suis long)
Le principe :
(Envoi des données)
- Je crée une socket avec SSL et je récupère son flux (inCon en entrée, outCon en sortie côté client/serveur)
- Je transforme un objet en tableau d'octets, car apparemment les sockets SSL n'acceptent pas les flux ObjectOutputStream. J'utilise donc un ObjectOutputStream sur un ByteArrayOutputStream. (Au passage j'aimerais bien y insérer un GZIPOutputStream). J'enregistre le résultat dans un tableau.
- J'envoie le tableau de bytes directement sur l'OutputStream de la socket.
(Réception des données)
- Je lis les données sur le flux d'entrée de la socket, que je stocke dans un tableau de bytes.
- Je crée un ByteArrayInputStream sur le tableau de bytes
- Je crée un ObjectInputStream sur le ByteArrayInputStream, et je lis directement l'objet.
Problèmes :
1- Lorsque j'insère un GZIPInputStream/GZIPOutputStream entre les ByteArray et Object Streams, la compression fonctionne mais pas la décompression
2- sans GZIP : Le premier échange fonctionne. Lorsque je récupère le second mesage, bien que tous mes objets soient créés dans la boucle, je lis le même message....
Explication : à la réception, je lis un tableau de bytes depuis le flux d'entrée. Le tableau est différent d'un message à l'autre. A ce moment, je crée de nouveaux ByteArray et Object InputStream. Malgré cela, le message obtenu à la fin est le même qu'au premier message recu.....
Je vous mets pour mieux comprendre la fonction de réception :
Voilà, si quelqu'un m'a compris
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 public Message getMessage() { ArrayList byteArrays = new ArrayList(); boolean finish=false; isFree=false; Message result = null; int nb=0; try { // Read the data from the socket InputStream while (!finish) { byte[] buf = new byte[4096]; System.out.println("Filling a buffer"); //int nb = input.read(buf); nb = inCon.read(buf); System.out.println(nb+" bytes read from the stream to the buffer"); if (nb == -1) finish = true; else if(nb<4096) {byteArrays.add(buf);finish = true;} else byteArrays.add(buf); } System.out.println(byteArrays.size()+" arrays of bytes read"); // Create an array of bytes containing all the bytes received int size = 4096*(byteArrays.size()-1)+nb; byte[] resultArray = new byte[size]; int i=0; for (Iterator ite = byteArrays.listIterator(); ite.hasNext(); ) { byte[] buf = (byte[]) ite.next(); for (int j=0;j<4096;j++) { if (i*4096+j < size) resultArray[i*4096+j]=buf[j]; else break; } i++; } // Read the data with an ObjectInputStream, using a ByteArrayInputStream System.out.println("size of the array : "+resultArray.length); ByteArrayInputStream baInput = new ByteArrayInputStream(resultArray); //ObjectInputStream in = new ObjectInputStream(new GZIPInputStream(baInput)); ObjectInputStream in = new ObjectInputStream(baInput); result = (Message)in.readObject(); System.out.println("received message : "+result.toString()); in.close(); /*result = (Message)in.readObject();*/ } catch (IOException e) { log.add(log.RMI, log.MAJOR,"(getMessage) IO Exception : "+e.getLocalizedMessage()); } catch (ClassNotFoundException cne) { log.add(log.RMI, log.MAJOR,"(getMessage) ClassNotFound Exception : "+cne.getLocalizedMessage()); } isFree=true; return result; }et aurait ne serait-ce qu'une piste de solution, je lui en serai reconnaissant mais alors à un point....
Merci d'avance
[ Modéré par vedaer ]
-> Ajout des balises code
[ Merci de respecter les Règles du Forum ]
Partager