En-tête de stream Java non valide

J’ai écrit une application client-serveur et je suis maintenant confronté à un problème que je ne sais pas comment résoudre:

C’est le client:

try { Socket socket = new Socket(ip, port); ObjectOutputStream ooos = new ObjectOutputStream(socket .getOutputStream()); SendMessage message = new SendMessage(); message.numDoc = value.numDoc; message.docFreq = value.docFreq; message.queryTerms = query; message.startIndex = startIndex; message.count = count; message.multiple = false; message.ips = null; message.ports = null; message.value = true; message.docFreq = value.docFreq; message.numDoc = value.numDoc; ooos.writeObject(message); ObjectInputStream ois = new ObjectInputStream(socket .getInputStream()); ComConstants mensajeRecibido; Object mensajeAux; Ssortingng mensa = null; byte[] by = null; do { mensajeAux = ois.readObject(); if (mensajeAux instanceof ComConstants) { System.out.println("Thread by Thread has Search Results"); Ssortingng test; ByteArrayOutputStream testo = new ByteArrayOutputStream(); mensajeRecibido = (ComConstants) mensajeAux; byte[] wag; testo.write( mensajeRecibido.fileContent, 0, mensajeRecibido.okBytes); wag = testo.toByteArray(); if (by == null) { by = wag; } else { int size = wag.length; System.arraycopy(wag, 0, by, 0, size); } } else { System.err.println("Mensaje no esperado " + mensajeAux.getClass().getName()); break; } } while (!mensajeRecibido.lastMessage); //ByteArrayInputStream bs = new ByteArrayInputStream(by.toByteArray()); // bytes es el byte[] ByteArrayInputStream bs = new ByteArrayInputStream(by); ObjectInputStream is = new ObjectInputStream(bs); QueryWithResult[] unObjetoSerializable = (QueryWithResult[])is.readObject(); is.close(); //AQUI TOCARIA METER EL QUICKSORT XmlConverter xce = new XmlConverter(unObjetoSerializable, startIndex, count); Ssortingng serializedd = xce.runConverter(); tempFinal = serializedd; ois.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } i++; } 

Et voici l’expéditeur:

 try { QueryWithResult[] outputLine; Operations op = new Operations(); boolean enviadoUltimo=false; ComConstants mensaje = new ComConstants(); mensaje.queryTerms = query; outputLine = op.processInput(query, value); //Ssortingng c = new Ssortingng(); //c = outputLine.toSsortingng(); //SsortingngBuffer swa = sw.getBuffer(); ByteArrayOutputStream bs= new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream (bs); os.writeObject(outputLine); os.close(); byte[] mybytearray = bs.toByteArray(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mybytearray); BufferedInputStream bis = new BufferedInputStream(byteArrayInputStream); int readed = bis.read(mensaje.fileContent,0,4000); while (readed > -1) { mensaje.okBytes = readed; if (readed < ComConstants.MAX_LENGTH) { mensaje.lastMessage = true; enviadoUltimo=true; } else mensaje.lastMessage = false; oos.writeObject(mensaje); if (mensaje.lastMessage) break; mensaje = new ComConstants(); mensaje.queryTerms = query; readed = bis.read(mensaje.fileContent); } if (enviadoUltimo==false) { mensaje.lastMessage=true; mensaje.okBytes=0; oos.writeObject(mensaje); } oos.close(); } catch (Exception e) { e.printStackTrace(); } } 

Et voici le journal des erreurs:

 Thread by Thread has Search Results java.io.StreamCorruptedException: invalid stream header: 20646520 at java.io.ObjectInputStream.readStreamHeader(Unknown Source) at java.io.ObjectInputStream.(Unknown Source) at org.tockit.comunication.ServerThread.enviaFicheroMultiple(ServerThread.java:747) at org.tockit.comunication.ServerThread.run(ServerThread.java:129) at java.lang.Thread.run(Unknown Source) 

Où à org.tockit.comunication.ServerThread.enviaFicheroMultiple(ServerThread.java:747) est cette ligne ObjectInputStream is = new ObjectInputStream(bs); sur le 1er code juste après while (!mensajeRecibido.lastMessage);

Des idées?

La valeur 20646520 est en ASCII @A .

ObjectInput / OutputStreams utilise une valeur “magique” au début du stream, pour indiquer qu’il est conforme à la sérialisation spéciale des objects. (Je pense que c’était 0xCAFEBABE , mais je ne suis pas sûr)

Dans votre cas, cela signifie que quelque chose a déjà lu le stream avant que ObjectInputStream ait la chance de lire la magie, ou que le stream qu’il lit n’est pas produit par un ObjectOutputStream;

Vous affectez la variable by à wig (ou ajout), qui est un tableau d’octets qui n’est pas généré par un ObjectOutputStream, pour autant que je mensajeRecipido.fileContent , puisqu’il utilise mensajeRecipido.fileContent . Je présume que mensajeRecipido.fileContent est le contenu d’un fichier réel. Dans cette instance en cours d’exécution n’a pas le même format qu’un ObjectOutputStream, c’est pourquoi vous obtenez l’exception d’en-tête de stream.