Socket ObjectInputStream liest nur Objekte der jeweiligen Programminstanz

  • Themenstarter Themenstarter Conrae
  • Beginndatum Beginndatum
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.
 
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.
 
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:
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.
 

Neue Themen


Zurück
Oben