Socket Client liest leeres Objekt

Scarabol

Mitglied
Hi Leute,

mein "Server" schickt ein Object vom Typ KlasseA an den Client so:
Java:
Socket connection;
/* ... */
dataOut = new ObjectOutputStream(connection.getOutputStream());
/* ... */
dataOut.writeObject(InstanzVonA);

connection ist eine bestehende Verbindung und wenn ich bei writeObject einen Breakpoint setze sind alle Member von InstanzVonA gesetzt, wie ich es erwarte.

Nun zu meinem Problem:
Wenn ich auf der Client Seite das Object wie folgt auslese, sind alle Member Variablen "null".
Java:
Socket socket = new Socket(hostname, port);
/* ... */
dataIn = new ObjectInputStream(socket.getInputStream());
/* ... */
obj = dataIn.readObject();
if (!(obj instanceof KlasseA)) {
System.err.println("Error");
} else {
KlasseA allesLeer = (KlasseA)obj;
// hier der Breakpoint, aber alles ist leer???

Woran liegt das?
 

Scarabol

Mitglied
Cool, danke für den guten Link hat meinem Verständnis sehr auf die Sprünge geholfen.

So wie ich das jetzt verstehe muss ich den Konstruktor mehrfach implementieren?
Oder ist eine private init() Funktion sinnvoll?
Gibt es noch eine andere Möglichkeit? Halte beide Lösungen für schlechten Stil, aber korrigiert mich bitte.

Was haltet ihr für den besten Stil?

Gruß
Scarabol
 
N

nillehammer

Gast
So wie ich das jetzt verstehe muss ich den Konstruktor mehrfach implementieren?
Nein, das musst Du nicht (zumindest nicht wegen Serialisierung). Manchmal kann kein Konstruktor, der alle (Pflicht-)Felder initialisiert aber recht praktisch sein.
Oder ist eine private init() Funktion sinnvoll?
Auch hier wieder: Nein, nur für Serialisierung ist das nicht sinnvoll. Wenn Deine Instanz einen Lebenzyklus durchläuft (bspw. init, start, stop, destroy wie ein Applet) kann es sinnvoll sein. Bei reinen Datenklassen fällt mir aber im Moment nicht ein, wo das sinnvoll sein könnte.
Was haltet ihr für den besten Stil?
Bei Serializables die Methoden "private void readObject" und "private void writeObject" implementieren und als jeweils erste Zeile defaultReadObject/defaultWriteObject aufrufen. Bei readObject ggf. noch den internen Status der Instanz validieren.
 

Scarabol

Mitglied
Bei welchen Member Datentypen muss ich diese extra in writeObject in den Stream schreiben bzw. wann muss ich diese extra mit readObject auslesen?

Also muss ich z.B. LinkedList<>, double oder eine Instanz meiner KlasseB extra in writeObject reinschreiben?

Gruß
Scarabol
 

Scarabol

Mitglied
juhu, denke ich habs verstanden. Man muss nur besondere Maßnahmen in der readObject Methode durchführen.

Warum meine Objekte dann leer sind versteh ich trotzdem nicht???
 
I

irgendjemand

Gast
könnte daran liegen das die klassen deiner member-objekte nicht Serializable implementieren *was bei primitiven datentypen sowieso nicht der fall ist*

hat allgemein auch was mit dem thema clone and depp-copy zu tun ... da hierbei in etwa das gleiche gemacht wird ... nur das zwischendurch die daten via stream verschickt werden ...

warum du allerdings objekte austauschst ... hmm .. mir würde nur RMI einfallen .. ansonsten sollte sich (fast) alles so implementieren lassen das du lediglich die raw-daten verschickst *alternativ codiert* und auf der anderen seite daraus selbst ein neues objekt baust anstatt dich mit serialisierung auseinander zu setzen
 
N

nillehammer

Gast
Also muss ich z.B. LinkedList<>, double oder eine Instanz meiner KlasseB extra in writeObject reinschreiben?
Mit der von mir geschilderten Methode werden alle Membervariablen serialisiert/deserialisiert. Das klappt, solange alle Member auch Serializable sind. Bei primitiven Datentypen (int, double etc.) und ihren Wrappern ist das der Fall, bei Strings auch. Anders kann es bei komplexeren (evtl. selbst definierten) Klassen/Datentypen aussehen.

Konkret zu Deiner Frage, wenn KlasseB nicht Serializable ist, bekommst Du eine Exception beim Versuch, es zu serialisieren. Du musst dann entweder KlasseB selbst Serializable machen oder Du machst das entspr. Member transient und behandelst es speziell.

Bei Klassen aus dem Collections-Framework (List, Set, Map etc.) verwendet man i.d.R. die Interfaces als Datentypen und initialisiert sie mit einer geeigneten Implementierung (z.B. LinkedList als Implementierung von List). Die Interfacetypen sind selbst nicht Serializable, die Implementierungen meistens schon. Hier kannst Du also entweder bequem sein und Dich darauf verlassen, dass Du immer nur eine Serializable Implementierung verwendest. Dann greift der default-Mechanismus. Ein kleines Restrisiko bleibt aber. Wenn Du hier ganz sicher gehen willst, musst Du auch diese Member transient machen und speziell behandeln.
 

Scarabol

Mitglied
Hi,

mein Problem war, dass alle Instanzen meiner Objekte im Stream gebuffert wurde, sodass immer das gleiche Object gesendet wurde auch wenn es sich zwischenzeitlich verändert hatte wurde trotzdem das "alte" Object ohne Änderung geschickt. Konnte diese Problem lösen, indem ich einfach ein reset() vor jedes writeObject gesetzt habe, so wird immer das aktuellste Objekt geschrieben.

Neuse Problem ist eine StreamCorruptedException die früher oder später auftritt:
Java:
java.io.StreamCorruptedException: unexpected end of block data
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1369)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
	at Client.run(Client.java:30)
Wann/Warum bekomm ich eine StreamCorruptedException?
Wenn Client und Server gleichzeitig in den Stream schreiben ohne das jemand liest?
Wenn ein Object nicht komplett in den Stream geschrieben wurde? (sollte doch eiglt. von Java ausgeschlossen sein, oder?)
Durch den übermäßigen (Miss/Ge)brauch von reset()? (Also vor jedem writeObject bzw. readObject())
Da die Exception oft schon am Anfang fliegt: Speichert die VM Teile der Verbindung zwischen? Sodass "Reste" des alten Versuchs zu beginn eines neuen übertragen werden?

Ziel des ganzen ist es, dass sich die Spielfigur bei SpielerA synchron mit ihrer Kopie bei SpielerB bewegt.

Vielen Dank für eure Hilfe
Scarabol
 
Zuletzt bearbeitet:

Scarabol

Mitglied
Juhu!

Ich konnte auch das StreamCorruptedException Problem lösen. Es lag einfach daran, dass das Timeout bei Lesen aktiviert wurde auch wenn der Socket gerade dabei war ein Object einzulesen.

Zusammenfassung:
"leere" Objekte:
Die Objekte in einem ObjectOutputStream werden gecached daher immer, wie folgt schreiben:
Java:
out.reset();
out.writeObject(obj);
out.flush();

StreamCorruptedException:
Außerdem sollte (vor allem wenn "große" Objecte gesendet werden) ein nicht zu kleines Timeout (< 10ms) gewählt werden, sondern ausreichend Zeit eingeplant werden (> 20ms) bzw. gar keine Timeout benutzt werden. Da die Zeiten je nach Hardware und Performance stark variieren können.
Java:
socket.setSoTimeout(20);

Gruß
Scarabol
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
B Axis2 Webservice mit Client Zertifikat Authentifizierung Netzwerkprogrammierung 3
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
T Jetty mit Client-Zertifikat nur bei spezifischer URL Netzwerkprogrammierung 1
J Einlesen von Servernachrichten von TCP-Client Netzwerkprogrammierung 17
J Client-Server und SOAP Netzwerkprogrammierung 23
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
T Client zu Client Kommunikation Netzwerkprogrammierung 2
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
ruutaiokwu ständig "sender address rejected: improper use of smtp" bei smtp-client Netzwerkprogrammierung 4
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
A Chatserver/-client - Code stoppt bei readUTF() Netzwerkprogrammierung 7
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
L Zugriffprobleme Client - Webservice AspenTechnology Netzwerkprogrammierung 0
A Client Client Übertragung Netzwerkprogrammierung 12
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
K Socket Netty Client wirft Fehler! Netzwerkprogrammierung 3
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
U Client Soap Verbindung wieder schließen Netzwerkprogrammierung 0
U Socket Client mit hash authentifizieren Netzwerkprogrammierung 3
F HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat Netzwerkprogrammierung 2
P Server als Client nutzen Netzwerkprogrammierung 8
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
J Client - Serversocket Netzwerkprogrammierung 1
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
N Fragen zu Sockets Client Netzwerkprogrammierung 3
F Extasys TCp Client extends Funktion Netzwerkprogrammierung 0
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
O Client zwischen XML und JSON auswählen lassen Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
A Socket Wie ein einfacher Multithreads Service mit Telnet als Client mit Observable/Observer gelöst.... Netzwerkprogrammierung 0
K C# Server - Android Client Netzwerkprogrammierung 0
T Application Client NullPointerExc Netzwerkprogrammierung 7
V TCP Client funktioniert auf Emulator aber nicht auf Smartphone Netzwerkprogrammierung 5
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
H HTTP REST Jersey - PUT-Beispiel von Client senden Netzwerkprogrammierung 0
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
P HTTP Server / Client Netzwerkprogrammierung 1
N FTP FTP Client invalid IPv6 address (Apache Commons Net API) Netzwerkprogrammierung 6
F TCP Client, verbindung aufrecht halten Netzwerkprogrammierung 0
X RMI: Woher kennt der Client das Schnittstellen-Interface? Netzwerkprogrammierung 2
E Thematik Client server Netzwerkprogrammierung 2
D UDP Client empfängt nichts Netzwerkprogrammierung 2
D Client/Server per Crossover Lan Kabel Netzwerkprogrammierung 1
S Client Server Connection Netzwerkprogrammierung 4
V erste Client - Server Anwendung, paar Fragen wie Socketverbindung checken usw. Netzwerkprogrammierung 4
S Client Anwendung mit zentraler SQL-Datenbank Netzwerkprogrammierung 3
N Client Identifikation eines Servers Netzwerkprogrammierung 1
S Sichere Server/Client Architektur Netzwerkprogrammierung 1
D Chat Server/mehre Client Netzwerkprogrammierung 9
I Server+Client Netzwerkprogrammierung 3
N Client am Server abmelden Netzwerkprogrammierung 0
F Server/Client Probleme Netzwerkprogrammierung 3
D SSH Client Netzwerkprogrammierung 7
U Socket Instant Messanger (Server Linux, Client Windows) Netzwerkprogrammierung 1
B TCP Client Android Netzwerkprogrammierung 3
Athena Grundsatzfragen zu Client-Server-Architektur / Matchmaking Netzwerkprogrammierung 1
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
F Client Server DB Netzwerkprogrammierung 0
A Verständnisfrage Multi-Threaded Client/Server Netzwerkprogrammierung 5
F Tipps zum Thema Server/Client vie SOAP Netzwerkprogrammierung 0
OnDemand Ist Client noch angemeldet? Netzwerkprogrammierung 7
F Socket Java - Server/Client simple Netzwerkprogrammierung 1
D Socket UDP Client reagiert nicht auf spontane Meldungen Netzwerkprogrammierung 5
R Zeitliche Syncronisation Server - Client Netzwerkprogrammierung 0
S Server-Client: Image senden Netzwerkprogrammierung 2
C Multithreading Client / Server erklärt Netzwerkprogrammierung 11
M Client sendet nur, wenn das Socket geschlossen wird Netzwerkprogrammierung 53
P server - client verbindung (anfänger) Netzwerkprogrammierung 8
S Socket (client) verbindet nicht Netzwerkprogrammierung 6
V Templates für Java Client rabbitmq Netzwerkprogrammierung 4
J Client Server - Serialisierung Netzwerkprogrammierung 8
C Client connection per Portforwarding auf einen lokalen Serverport Netzwerkprogrammierung 3
Luk10 Server / Client: Clients speichern! Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben