Socket neue Referenz auf ObjectInputStream

NagaraHyuga

Mitglied
Hi,

Ich habe einen ObjectInputStream erzeut:

Java:
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());

Nun möchte ich dem ObjectInputStream eine neue Referenz zuweisen:

Java:
in = new ObjectInputStream(socket.getInputStream());

Doch an dieser Stelle hängt sich das Programm einfach auf. Ich habe es auch schon debugged: Genau an dieser Stelle bleibt es hängen und geht nicht mehr weiter.

Weiß jemand warum das so ist und wie man es richtig hinbekommt??

MFG
 

cr33p

Mitglied
Probier mal den InputStream mit .close() zu schließen und dann neu zu referenzieren.

Falls das nicht hilft, setz nach dem close() den InputStream auf null (in = null; ) und refernzier ihn dann neu.

Falls das auch nicht hilft musst leider auf weitere Voschläge warten.
 

HoaX

Top Contributor
a) Macht es eigentlich null Sinn was du da vor hast, wieso will man das?
b) ObjectInput/OuputStream verwendet intern ein eigenes Protokoll. Wenn du einen neuen OIS erstellst, dann wartet der auf einen Streamheader vom ebenfalls neuen OOS auf der Gegenseite, den es hier wohl nicht gibt.
c) Solltest du, wie cr33p vorgeschagen hat, versuchen den OIS zu schließen, so wird auch der darunterliegende Stram geschlossen -> Du musst deine Stream-Quelle erneut anzapfen/Verbindung aufbauen.

Edit: d) Am Ende hättest du ja dann zwei OIS auf einem Stream, das wird nicht funktionieren, da die sich dann gegenseitig die Datenpakete wegschnappen was dazu führt, dass bei keinem mehr ein valider Stream ankommt, Pakete verloren gehen, nurnoch Müll angkommt -> ne Exception fliegen wird.
 
Zuletzt bearbeitet:

NagaraHyuga

Mitglied
Hi,

mit close() kann ich es nicht machen, da dann auch die Socket-Verbindung geschlossen wird. Also ich habe mehrere Sockets in einer Hashmap gespeichert und EINEN ObjectInputStream. Ich möchte durch auswählen zwischen den Sockets hin und her switchen und natürlich auch den ObjectInputStream übernehmen.

Falls ihr eine bessere Möglichkeit habt, dann raus damit :)
 

FArt

Top Contributor
Hi,

mit close() kann ich es nicht machen, da dann auch die Socket-Verbindung geschlossen wird. Also ich habe mehrere Sockets in einer Hashmap gespeichert und EINEN ObjectInputStream. Ich möchte durch auswählen zwischen den Sockets hin und her switchen und natürlich auch den ObjectInputStream übernehmen.

Falls ihr eine bessere Möglichkeit habt, dann raus damit :)

Wie?
Vielleicht solltest du beschreiben, was du mit diesem Konstrukt eigentlich erreichen möchtest. Es scheint, als hättest du das Konzept hinter Sockets noch nicht verstanden.

Wenn die Sockets in der Map stecken, kannst du dir immer den passenden InputStream geben lassen (die gehören zusammen). Konkurrierend da drauf zuzugreifen ist natürlich nicht sinnvoll.
 

NagaraHyuga

Mitglied
Also ich habe ein paar Socket-Verbindungen zu verschiedenen Clienten offen. Nun möchte ich entscheiden können, wem ich schreibe. Einmal dem und dann dem andern :) .

Jetzt habe ich es mit einer lokalen Variablen probiert:

Java:
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
Doch dann kommt diese Exeption:

java.io.StreamCorruptedException: invalid stream header: 73720015
at java.io_ObjectInputStream.readStreamHeader(Unknown Source)
at java.io_ObjectInputStream.<init>(Unknown Source)
at de.Test.SC$4.run(SC.java:543)
at java.lang.Thread.run(Unknown Source)

Die Socket-Verbindung ist auf jedenfall vorhanden (habe es mit System.out.println(socket); getestet)
Wo liegt denn dann der Fehler?? Warum wird diese Exception geschmissen??
 

Murray

Top Contributor
Zu einem Socket darfst du immer nur einen ObjectInputStream aufmachen - merk dir doch die ObjectInputStreams, so wie du dir jetzt die Scokets merkst.
 

FArt

Top Contributor
Nun möchte ich entscheiden können, wem ich schreibe.
Schreiben? InputStream?

Wenn du von mehreren InputStreams lesen möchtest, dann brauchst du mehrere Threads, da das lesen blockiert. Nonblocking IO geht mit Channels.

Die Socket-Verbindung ist auf jedenfall vorhanden (habe es mit System.out.println(socket); getestet)
Du hast getestet, ob du ein Socket-Objekt hast, das sagt noch nichts über den Zustand des Sockets aus.

Ich komme noch mal auf die Bemerkung zurück, dass du u.U. noch nicht weißt was du gerade tust, was Sockets sind und wie man diese verwendet.
Lesson: All About Sockets (The Java™ Tutorials > Custom Networking)
JDK 1.4.2 New I/O-related APIs & Developer Guides -- from Sun Microsystems
 

NagaraHyuga

Mitglied
Tut mir Leid hab mich verschrieben... Ich meine mit dem ObjectOutputStream nicht schreiben sondern ein Objekt verschicken. Und mit dem ObjectInputStream lese ich die Antworten(ebenfalls ein Objekt).

Ich habe jetzt eine HashMap extra für die ObjectInputStreams erstellt und füge sie dort hinzu.

Java:
 input.put(counter, new ObjectInputStream(socket
						.getInputStream()));

Doch taucht hier wieder mein Problem auf: Das Programm bleibt einfach an dieser Stelle stehen, egal wie lange ich warte...
 

NagaraHyuga

Mitglied
Nein der Thread wird nicht weitergehen. Es klappt jetzt alles. Auf jedenfall vielen Dank!!! Ich musste nur erst den ObjectOutputStream erstellen(Client) , und dann den ObjectInputStream (Server) :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P RMI - Neue eigene Instanz für jeden Aufruf auf nicht serialisierbares Objekt - wie? Netzwerkprogrammierung 0
P Socket neuer Client - neue(r) Socket/Verbindung geöffnet? Netzwerkprogrammierung 6
D new ObjectInputStream(socket.getInputStream()); Netzwerkprogrammierung 15
G ObjectOutputStream und ObjectInputStream machen Ärger Netzwerkprogrammierung 17
F ObjectInputStream.readObject() mehrfach aufrufen Netzwerkprogrammierung 2
J ObjectInputStream im Netzwerk Netzwerkprogrammierung 8
K ObjectInputStream EOF Netzwerkprogrammierung 6
G ObjectInputStream hängt ganzes Programm auf... Netzwerkprogrammierung 7
X ObjectInputStream StringCorruptedException Netzwerkprogrammierung 3
V StreamCorruptedException bei ObjectInputStream und ObjectOStream Netzwerkprogrammierung 5
S FileInputStream und ObjectInputStream Netzwerkprogrammierung 18
C Socket ObjectInputStream liest nur Objekte der jeweiligen Programminstanz Netzwerkprogrammierung 5
M InputStream and ObjectInputStream zur gleichen Zeit Netzwerkprogrammierung 11
J Socket ObjectInputStream prüfen Netzwerkprogrammierung 8
E Rausfinden ob noch Objecte in ObjectInputStream Netzwerkprogrammierung 5
Y Problem mit ObjectInputStream beim lesen vom Socket Netzwerkprogrammierung 10
C komisches Problem / ObjectInputStream erstellt sich nicht Netzwerkprogrammierung 5
K ObjectInputStream mit CypherInputStream hängt Netzwerkprogrammierung 7
G Datei über ObjectInputStream versenden Netzwerkprogrammierung 8
R ObjectOutput- / ObjectInputStream Exception? Netzwerkprogrammierung 2
E ObjectInputStream/ObjectOutputStream nicht erzeugbar Netzwerkprogrammierung 2
T Problem mit ObjectInputStream Netzwerkprogrammierung 2
C Kollision von ObjectInputStream und BufferedReader ? Netzwerkprogrammierung 6
G ObjectInputStream gebuffert? Netzwerkprogrammierung 3

Ähnliche Java Themen


Oben