StreamCorruptedException: codice di tipo non valido: AC

Il mio problema è quando tenta di leggere l’object la seconda volta, genera l’eccezione:

java.io.StreamCorruptedException: invalid type code: AC at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at Client.run(BaseStaInstance.java:313) java.io.StreamCorruptedException: invalid type code: AC at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at Client.run(BaseStaInstance.java:313) 

La prima volta che invio lo stesso identico messaggio object; tuttavia, quando provo a fare la stessa cosa la seconda volta, lancia l’errore sopra. Devo re-intializzare il metodo readObject ()? Ho anche stampato l’object messaggio ricevuto dalla riga sottostante ed è esattamente lo stesso della prima istanza in cui funziona correttamente.

 Object buf = myInput.readObject(); 

Suppongo che ci sia qualche problema con l’aggiunta, ma non ho davvero alcun senso per l’aggiunta. Voglio solo leggere una nuova linea ogni volta. Apprezzerei molto l’aiuto nel correggere questo bug. Grazie.

==================================

Prima di quella riga, sto solo creando gli oggetti di input e output per il socket nel metodo run (). La dichiarazione dell’object è esterna al metodo run () della class: –

 @Override public void run() { try { sleep((int) 1 * 8000); } catch (Exception e) { e.printStackTrace(); } try { //Creating input and output streams to transfer messages to the server myOutput = new ObjectOutputStream(skt.getOutputStream()); myInput = new ObjectInputStream(skt.getInputStream()); while (true) { buf = myInput.readObject(); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { } catch (Exception e) { e.printStackTrace(); } } } 

Hai ragione; Non chiudo l’object. Non sono sicuro di come farlo.

Il problema di fondo è che si sta utilizzando un nuovo ObjectOutputStream per scrivere su un ObjectInputStream esistente che è già stato utilizzato un ObjectOutputStream precedente su cui scrivere. Questi stream hanno intestazioni che sono scritte e lette dai rispettivi costruttori, quindi se crei un altro ObjectOutputStream dovrai scrivere una nuova intestazione, che inizia con – indovina cosa? – 0xAC, e l’ ObjectInputStream esistente non prevede un’altra intestazione a questo punto, quindi barfs.

Nel thread dei forum Java citato da @trashgod, avrei dovuto omettere la parte relativa a “nuovo per ogni object alle due estremità”: è solo uno spreco. Utilizzare un singolo OOS e OIS per la durata del socket e non utilizzare altri flussi sullo zoccolo.

Se vuoi dimenticare ciò che hai scritto, usa ObjectOutputStream.reset().

E non utilizzare altri flussi o Readers o Writers sullo stesso socket. Le API del stream di oggetti possono gestire tutti i tipi di dati primitivi Java e tutte le classi Serializable .