StreamCorruptedException: invalid type code: AC
Mein problem ist, wenn er versucht, das Objekt Lesen, das zweite mal wirft er die exception:
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)
Als ich das erste mal senden, die genau die gleiche Objekt, Nachricht; allerdings, wenn ich versuche, das gleiche zu tun, das zweite mal wirft er die oben genannten Fehler. Muss ich re-intialize die readObject () - Methode? Ich selbst gedruckt aus dem message-Objekt, das empfangen wird durch die Linie unten, und Ihre genaue das gleiche wie das erste Beispiel, wo es funktioniert ok.
Object buf = myInput.readObject();
Ich nehme an, es ist ein problem mit Anhängen, aber ich habe wirklich keine Verwendung für das anfügen. Ich wollt einfach nur eine frische Linie jedes mal.
Ich würde wirklich zu schätzen einige Hilfe bei der Festsetzung dieser Fehler. Danke.
==================================
Vor, dass eine Zeile, ich bin nur die Erstellung der input-und output-Objekte für die Steckdose in der run () - Methode. Die object-Deklaration ist außerhalb der run () - Methode in der Klasse:-
@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();
}
}
}
Du hast Recht; ich glaube nicht, schließen Sie das Objekt. Ich bin mir nicht sicher, wie das zu tun.
NB Sie fangen sollte EOFException und nicht behandeln es als einen Fehler: anmelden nicht oder drucken Sie den stack-trace; lass es einfach beenden, das Lesen-Schleife. Ich weiß nicht, warum Sie fangen UnknownHostException, wo Sie sind: es kann nicht geworfen werden innerhalb der entsprechenden try-block. Sleep() ist nur eine Verschwendung von Zeit. Entfernen Sie es.
InformationsquelleAutor leba-lev | 2010-03-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das zugrunde liegende problem ist, dass Sie mit einem neuen
ObjectOutputStream
zu schreiben, um eine vorhandeneObjectInputStream
haben Sie bereits eine VorherigeObjectOutputStream
zu schreiben. Diese Ströme haben überschriften, die sind geschrieben und gelesen von den jeweiligen Konstruktoren, so dass, wenn Sie erstellen eine andereObjectOutputStream
schreiben Sie einen neuen header, der startet mit - na was wohl? -0xAC,
und die vorhandenenObjectInputStream
nicht erwarten, dass ein anderes header-in diesem Punkt so barfs.In den Java-Foren-thread zitierte von @trashgod, ich hätte aus dem Teil über 'neu für jedes Objekt, das an beiden enden": das ist einfach nur verschwenderisch. Verwenden Sie eine einzelne OOS und OIS für das Leben der Steckdose, und verwenden Sie keine anderen streams auf dem sockel.
Wenn Sie wollen, zu vergessen, was Sie geschrieben haben, verwenden Sie
ObjectOutputStream.reset().
Und verwenden Sie keine anderen streams oder
Readers
oderWriters
auf der gleichen Steckdose. Das stream-Objekt-APIs kann mit allen Java primitive Datentypen und alleSerializable
Klassen.evrytime ich den code auszuführen, der eine neue OOS und OIS erstellt. wie kann ich das schaffen?
Ich weiß nicht, was Fragen Sie mich das nicht schon weiter oben geantwortet.
hier, in meiner Klasse bin mit zwei verschiedenen Methoden für die output-und input-streams und in der Nähe von Eingabe-stream bin immer der Fehler. U kann mir sagen, wo, um die oben genannten code?
Welchen code? Ich habe nicht geschrieben, einen code. Der Kern dieser Antwort liegt in der entfernen - code.
InformationsquelleAutor user207421