java.io.StreamCorruptedException: intestazione del stream non valida: 7371007E

Ho un’applicazione client client che comunica usando oggetti.
quando invio solo un object dal client al server funziona tutto bene.
quando provo a inviare più oggetti uno dopo l’altro sullo stesso stream che ottengo

StreamCorruptedException. 

Qualcuno può indirizzarmi alla causa di questo errore?

metodo di scrittura del cliente

  private SecMessage[] send(SecMessage[] msgs) { SecMessage result[]=new SecMessage[msgs.length]; Socket s=null; ObjectOutputStream objOut =null; ObjectInputStream objIn=null; try { s=new Socket("localhost",12345); objOut=new ObjectOutputStream( s.getOutputStream()); for (SecMessage msg : msgs) { objOut.writeObject(msg); } objOut.flush(); objIn=new ObjectInputStream(s.getInputStream()); for (int i=0;i<result.length;i++) result[i]=(SecMessage)objIn.readObject(); } catch(java.io.IOException e) { alert(IO_ERROR_MSG+"\n"+e.getMessage()); } catch (ClassNotFoundException e) { alert(INTERNAL_ERROR+"\n"+e.getMessage()); } finally { try {objIn.close();} catch (IOException e) {} try {objOut.close();} catch (IOException e) {} } return result; } 

metodo di lettura del server

 //in is an inputStream Defined in the server SecMessage rcvdMsgObj; rcvdMsgObj=(SecMessage)new ObjectInputStream(in).readObject(); return rcvdMsgObj; 

e la class SecMessage è

 public class SecMessage implements java.io.Serializable { private static final long serialVersionUID = 3940341617988134707L; private String cmd; //... nothing interesting here , just a bunch of fields , getter and setters } 

Se si inviano più oggetti, è spesso più semplice mettere loro una sorta di contenitore / collezione come un Object[] o List . Ti evita di dover controllare esplicitamente la fine del stream e si occupa di trasmettere in modo esplicito quanti oggetti ci sono nello stream.

EDIT: Ora che ho formattato il codice, vedo che hai già i messaggi in un array. Basta scrivere la matrice sul stream di oggetti e leggere l’array sul lato server.

Il tuo “metodo di lettura server” sta leggendo solo un object. Se viene chiamato più volte, si otterrà un errore dal momento che sta tentando di aprire diversi flussi di oggetti dallo stesso stream di input. Questo non funzionerà, dal momento che tutti gli oggetti sono stati scritti nello stesso stream di oggetti sul lato client, quindi è necessario rispecchiare questa disposizione sul lato server. Cioè, usa un stream di input di un object e leggi più oggetti da quello.

(L’errore che si ottiene è dovuto al fatto che objectOutputStream scrive un’intestazione, prevista da objectIutputStream. Poiché non si scrivono più flussi, ma semplicemente più oggetti, il successivo objectInputStream creato sull’ingresso socket non riesce a trovare una seconda intestazione e genera un’eccezione.)

Per risolvere il problema, creare objectInputStream quando si accetta la connessione socket. Passa questo objectInputStream al tuo metodo di lettura del server e leggi Oggetto da quello.

quando invio solo un object dal client al server funziona tutto bene.

quando provo a inviare più oggetti uno dopo l’altro sullo stesso stream, ricevo StreamCorruptedException .

In realtà, il codice cliente sta scrivendo un object sul server e leggendo più oggetti dal server. E sul lato server non c’è nulla che stia scrivendo gli oggetti che il client sta cercando di leggere.

Questa eccezione può verificarsi anche se si utilizzano Socket da un lato e SSLSocket dall’altro. La coerenza è importante.