# java.io.StreamCorruptedException: invalid stream header



## Angel4585 (27. Dez 2007)

Wie in dem andern thread beschrieben, habe ich beim Empfangen eines Streams Probleme.
Manchmal geht es problemlos, manchmal kommt diese Meldung:


```
java.io.StreamCorruptedException: invalid stream header: 00000000
        at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)
        at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
        at com.Connection.readObject(Connection.java:120)
        at com.Connection.read(Connection.java:74)
        at com.ConnectionList.execute(ConnectionList.java:48)
        at abstr.CSThread.run(CSThread.java:38)
```

Es ist für mich nicht nachvollziehbar an welcher Stelle das alles passiert, bzw warum es passiert 

Klar ist: Ich Habe ein Objekt welches Serializable implementiert, schreibe das pber einen ObjectOutputStream in ein ByteArrayOutputStream, dessen Array ich über einen SocketChannel an den Empfänger versende.

Der Empfänger liest nun das Ganze in ein ByteBuffer, aus diesem erzeuge ich einen ByteArrayInputStream und lese über einen ObjectInputStream das Objekt aus.

Manchmal geht es, manchmal nicht. Das tritt auf verschiedensten Rechnern auf.

Es ist bei Sender und Empfänger das selbe Paket, also keine unterschiedlichen Quellcodes.

Es wäre echt klasse wenn jemandem dieses Problem bekannt wäre und er mir helfen könnte.


----------



## Angel4585 (27. Dez 2007)

Mir fällt grad auf das beim Empfänger garnichts ankommt, bzw nur ein Teil.

Verschickt werden 300 Bytes, ankommen tut 0.
Oder es werden 300.000 Bytes verschickt und es kommen nur 18.000 oder so an.

Kann ich das irgendwie machen das ich beim Empfänger in einer Schleife solange einlese bis alles da ist? Ich hab ja die Anzahl der Bytes die ankommen soll.

Also ich mach das ja so:


```
ByteBuffer bb1 = ByteBuffer.allocate(4);
schannel.read(bb1);
ByteBuffer bb2 = ByteBuffer.allocate(bb1.getInt(0));
schannel.read(bb2);
```
und dieses read gibt mir nicht das an was ankommen soll.
Kann es sein das noch nicht alles da ist?
Ich lese ja mehr oder weniger auf verdacht. Ich schicke erst die ByteZahl des Objekts, bzw des Streams, lese diese aus und lese dann sofort wieder.


----------



## tuxedo (28. Dez 2007)

>> Kann ich das irgendwie machen das ich beim Empfänger in einer Schleife solange einlese bis alles da ist? Ich hab ja die Anzahl der Bytes die ankommen soll. 

readFully() heisst das Zauberwort. Gibts im DataInputStream ...

Oder halt mitschreiben wie viel schon gelesen wurde (read() liefert ja die Anzahl der gelesenen Bytes zurück) und sooft read() aufrufen bis die gewünschte Anzahl gelesen wurde.

- Alex


----------

