Socket ObjectInputStream liest nur Objekte der jeweiligen Programminstanz

C

Conrae

Gast
Hallo,

ich habe mir aus Spass an der Sache eine kleine Applikation geschrieben. Um zwei Instanzen der Applikation zu vernetzen, wollte ich zwischen ihnen mittels ObjectOutput-/ObjectInputStream Objekte hin- und herschicken. Doch leider scheint der ObjectInputStream jeweils nur den Inhalt zu lesen, den die jeweilige Instanz in den ObjectOutputStream schiebt.
Schätzungsweise werde ich bei der Verlinkung der einzelnen Streams einen Fehler machen. Hier ist mal mein Code:

Java:
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * Networking class responsible to communicate with other clients.
 * @author Patrick
 */
public class Network {

    private ServerSocket serverSocket = null;
    private Socket clientSocket = null;
    private ObjectOutputStream objectOutputStream = null;
    private ObjectInputStream objectInputStream = null;

    public Network() { // host constructor
        try {
            serverSocket = new ServerSocket(0);
            System.out.println("Waiting for connection on port: " + serverSocket.getLocalPort());
            clientSocket = serverSocket.accept();

            System.out.println("Incoming connection: " + clientSocket.getInetAddress()
                    + "\nEstablishing connection.");
            
            objectOutputStream = new ObjectOutputStream(clientSocket.getOutputStream());
            objectOutputStream.flush();
            objectInputStream = new ObjectInputStream(new BufferedInputStream(clientSocket.getInputStream()));
        } catch (IOException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
    }

    public Network(String address, Integer port) { // client constructor
        try {
            InetAddress iaddress = InetAddress.getByName(address);
            clientSocket = new Socket(iaddress, port);
            objectOutputStream = new ObjectOutputStream(clientSocket.getOutputStream());
            objectOutputStream.flush();
            objectInputStream = new ObjectInputStream(new BufferedInputStream(clientSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        } catch (IOException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
    }

    public void sendObject(Object o) {
        try {
            objectOutputStream.reset();
            objectOutputStream.writeObject(o);
            objectOutputStream.flush();
        } catch (IOException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
    }
    
    public Object receiveObject() {
        Object o = null;
        try {
            o = objectInputStream.readObject();
        } catch (IOException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        } catch (ClassNotFoundException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
        o.getClass();
        return o;
    }

}

Über Hilfe würde ich mich freuen. Und habt Nachsicht, das ist mein erster Gehversuch mit den Sockets.
 
C

Conrae

Gast
Hmm, das Thema habe ich mir kurz angesehen, das scheint damit nichts zu tun zu haben. Ich bin dabei jedoch auf die Serialization gestossen. Ich bin in meiner Naivität davon ausgegangen, dass bei der Serialisation der exakte Zustand des Objektes gespeichert und dann übertragen wird. Das scheint aber nicht der Fall zu sein, sofern ich das richtig verstanden habe. Stattdessen wird der Konstruktor des Objektes auf der anderen Seite aufgerufen. So weit richtig?
Gibt es denn eine Methode, um den exakten Zustand wiederherzustellen? Die Objekte halten Maps<Integer, objectX>, wobei objectX eine weitere Klasse ist, die ein Array<objectY> hält.
 
S

SlaterB

Gast
ohne Serialization geht das ganze ja gar nicht, was machst du denn bisher, welche Klassen versendest du?
da musst du doch bei eigenen Klassen auch schon das Interface implementieren, also auf den Mechanismus an sich gestoßen sein,

versendet wird der komplette Objekt-Zustand, sofern nicht Attribute als 'transient' markiert sind, Konstruktor spielt da schon eine Rolle, Rest aber auch,

was ist eigentlich das konkrete Problem, tritt eine Fehlermeldung auf oder erhälst du nur einen falschen Objektzustand/ gar kein Objekt zurück

> Doch leider scheint der ObjectInputStream jeweils nur den Inhalt zu lesen, den die jeweilige Instanz in den ObjectOutputStream schiebt.

das wortwörtlich kann man schon verhindern, wenn eine Seite nur sendet, die andere nur empfängt,
also testweise ein Objekt übertragen wird, klappt das ja oder nein?
 
Zuletzt bearbeitet von einem Moderator:
C

Conrae

Gast
Ja klar, auf die Serialisation bin ich schon zuvor gestossen und hatte das Interface auch in den betreffenden Klassen drin. Nur war mir da nicht bewusst, dass man möglicherweise auch noch bestimmte Dinge beachten muss, damit die Serialisierung korrekt abläuft.
Wie ich gerade lese, werden statische Objekte nicht mit persistiert. Im Nachhinein natürlich logisch, aber darauf bin ich zuvor nicht gestossen oder von alleine drauf gekommen. Jetzt funktioniert es jedenfalls, die richtigen Objektzustände werden übermittelt.

Vielen Dank.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
M InputStream and ObjectInputStream zur gleichen Zeit Netzwerkprogrammierung 11
J Socket ObjectInputStream prüfen Netzwerkprogrammierung 8
N Socket neue Referenz auf ObjectInputStream Netzwerkprogrammierung 13
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
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
A Socket-Anwendung (BufferedWriter/Reader liest nicht aktuellen Wert) Netzwerkprogrammierung 6
R Anfängerbeispiel: Suche Java-Anwendung die http-Anfragen in Tomcat liest Netzwerkprogrammierung 8
K Server liest Daten nicht Netzwerkprogrammierung 6
M Socket InputStream liest nicht vollständig Netzwerkprogrammierung 7
M Was macht Thread, wenn er aus einem "leeren" Inputstream liest ? Netzwerkprogrammierung 5
S Socket Client liest leeres Objekt Netzwerkprogrammierung 10
R TCP Server liest nichts Netzwerkprogrammierung 8
H PC-A sendet, PC-B liest aus Netzwerkprogrammierung 32
A InputStream liest immer komplettes PHP-Script Netzwerkprogrammierung 6
T JSON-Objekte richtig parsen Netzwerkprogrammierung 8
L Socket Wie kann man in Java die Anzahl der Objekte in einem InputStream sehen ohne ihn durchgehen zu müssen Netzwerkprogrammierung 1
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
A RMI RMI - Thread Objekte übertragen und auf anderer Machine weiterlaufen lassen Netzwerkprogrammierung 0
C List Deserialisierung entfernt Objekte Netzwerkprogrammierung 2
F HTTP Serialisierte Objekte aus Datei von Server Netzwerkprogrammierung 1
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
V Socket Objekte werden nicht aktualisiert Netzwerkprogrammierung 2
S Socket Über UDP Objekte verschicken Netzwerkprogrammierung 9
B Eigene Objekte per RMI übergeben Netzwerkprogrammierung 2
S Kapselung der Netz-Objekte Netzwerkprogrammierung 3
B verschiedene Serialisierte Objekte identifizieren? Netzwerkprogrammierung 5
T Objekte im NIO unblocking mode versenden Netzwerkprogrammierung 11
G Frage zu Servlets und deren Objekte + Bilder in Servlets anzeigen? Netzwerkprogrammierung 11
G Objekte per TCP verschicken + Thread Netzwerkprogrammierung 4
T Laufen Objekte, die vom Cajo-Server geliefert werden, lokal auf dem Client? Netzwerkprogrammierung 4
T Inputstream -> verschiedene Objekte lesen Netzwerkprogrammierung 3
I Objekte über das Netzwerk Netzwerkprogrammierung 5
M Messenger - String oder Objekte Netzwerkprogrammierung 4
S Netzwerk und Objekte Netzwerkprogrammierung 5
S RMI 1.) Entfernte Objekte "Zwischenspeichern" 2.) Threadsicherheit Netzwerkprogrammierung 2
T rmi ssl zu große Objekte übergeben -> Exception Netzwerkprogrammierung 10
A Konflikt: Blocking und Non-Blocking bei Objekte versenden Netzwerkprogrammierung 4
N RMI und Datenbank Objekte Netzwerkprogrammierung 3
P Objekte über DatagramSocket versenden Netzwerkprogrammierung 12
R Mittels BufferedReader Objekte lesen? Netzwerkprogrammierung 5
M Objekte senden zwischen Java und PHP mit SOAP Netzwerkprogrammierung 9
A Objekte in übergebenen Objekten mit WebServices? Netzwerkprogrammierung 6
A RMI wie kann ich objekte übergeben? Netzwerkprogrammierung 5
P Serialialiserte Objekte übers Netzwerk verschicken Netzwerkprogrammierung 9
S Objekte zwischen Client und Server über Sockets senden Netzwerkprogrammierung 2

Ähnliche Java Themen


Oben