[ObjectInputStream]Pb avec GZIP et ByteArrayInputStream
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 :D
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 :
Code:
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;
} |
Voilà, si quelqu'un m'a compris :oops: 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 ]