Netzwerk / ObjectStreams

Hi an alle.

Wir haben ein Problem: Wir schreiben grade ein Javaprojekt und verwenden dabei ObjectInput- und Outputstreams. Aber wir bekommen nach der Zeit Probleme beim Empfangen. Wir bekommen andere Daten an als wir senden.

Der Fehler beim Client der dadurch resultiert:
java.io.streamCorruptedExeption: unknown Source: invalid typ Code 30

Fehlercodes gab es auch schon andere. Kann man Java nicht einfach sagen, ignoriere diesen Fehler oder warum passiert sowas überhaupt??

Hoffe jemand kann helfen.

MfG
Daniel

Hi Daniel,

Der Fehler beim Client der dadurch resultiert:
java.io.streamCorruptedExeption: unknown Source: invalid typ
Code 30

Fehlercodes gab es auch schon andere. Kann man Java nicht
einfach sagen, ignoriere diesen Fehler oder warum passiert
sowas überhaupt??

ignorieren wäre wohl keine gute Idee. Passieren kann das z.B., wenn die Streams nicht parellel geöffnet und geschlossen werden, sondern z.B. der Empfänger nach jedem Objekt zu und wieder aufgemacht wird. Auch besser erst den OutputStream schließen - der InputStream schließt dann eh von alleine.

Alles Gute wünscht
… Michael

Moien

Wir haben ein Problem: Wir schreiben grade ein Javaprojekt und
verwenden dabei ObjectInput- und Outputstreams.

Die ObjectStreams alleine sind schon ein Problem.

Aber wir
bekommen nach der Zeit Probleme beim Empfangen. Wir bekommen
andere Daten an als wir senden.

ObjectStreams cachen. Das macht sie so unheimlich beliebt. Beispiel:

Object1.setValue (5);
stream.writeObject (Object1);
Object1.setValue (4);
stream.writeObject (Object1);

erzeugt 2x Object1 mit Value = 5 auf der anderen Seite. Die 4 geht verloren. Die Streams schreiben jedes Object nur einmal, egal ob sich sein Zustand geändert hat oder nicht. Dafür gibt es ObjectOutputStream.reset().

Der Fehler beim Client der dadurch resultiert:
java.io.streamCorruptedExeption: unknown Source: invalid typ
Code 30

Das hört sich eher nach einem Problem mit den class-Dateien an. Nach jeder Änderung, egal wie winzig sie auch war, müssen alle class-Dateien auf allen Rechnern ausgetauscht werden. Läst man eine alte class Datei stehen können gar unlustige Dinge passieren.

Kann man Java nicht
einfach sagen, ignoriere diesen Fehler

Doch, kann man. Aber falls irgendwas sinnvolles bei rumkommen soll …

cu

Bisher verwenden wir nur Strings zum Übertragen. Kann da schon was nicht klappen beim Austausch?

public void sendObject(String string) {
try {
oos.reset();
oos.writeObject((String) string);
} catch (IOException e) {
// Verbindung beendet
System.out.println(„Verbindung beendet“);
e.printStackTrace();
}
}

Moien

Bisher verwenden wir nur Strings zum Übertragen. Kann da schon
was nicht klappen beim Austausch?

Mit Strings (bei alten JVMs bis 65KB) sollte das keinerlei Probleme machen. Allerdings frage ich mich ganz ernsthaft wieso man bei Strings Objectstreams benutzt. Noch mehr von hinten durch die Brust ins Auge geht doch gar nicht…

cu

off-topic

Noch mehr von
hinten durch die Brust ins Auge geht doch gar nicht…

naja, man könnte natürlich ein webservice auf basis tomcat und axis schreiben, eine schön komplizierte wsdl dazu und das ganze mit einem system wie oracle bpel verknüpfen und überhaupt…

lg
erwin

ps: ich kenne leute persönlich, die ernsthaft verschiedene komponenten einer applikation über bpel verknüpfen wollten. insofern sind strings über objectstreams ja eh harmlos.

Ja das stimmt schon. Aber wir haben erst überlegt ob wir die einzelnen Objekte nicht selbst schicken könnten. Aber da das an BufferedImages gescheitert ist, die man nicht serialisieren kann. Die Objektstreams sind noch das Überbleibsel dieses Versuches…

Mal sehen ob wir es nicht doch wieder umbauen. Vielen Dank auf jeden Fall für die superschnellen Antworten.

MfG
Daniel

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

OK Wir haben das jetzt auf folgenden Code umgewandelt:

public void sendObject(String string) {
try {
out.write(string + „/“);
System.out.println("Out: " + string);
} catch (IOException e) {
// Verbindung beendet
System.out.println(„Verbindung beendet“);
e.printStackTrace();
}
}

Aber:

Der Server kann senden und der Empfänger empfängt, aber wenn der Client sendet empfängt der Server nix :frowning: Keine Fehler kein nichts kein output…

hallo

schon mal probiert, den buffer zu flushen? (outputstream.flush). wirkt manchmal wunder…

ausserdem fehlt mir im beispielcode irgendwie das schließen des streams - sollte eigentlich im finally-block erfolgn.

lg
erwin