# Problem mit ObjectStreams



## HerrJemineh (4. Mai 2014)

Hallo liebes Forum,

Ich habe eine Klasse "Message" und möchte ein Objekt dieser Klasse vom Server zum Client mittels ObjectOutputStream senden.

Klasse Message:


```
import java.io.Serializable;


@SuppressWarnings("serial")
public class Message implements Serializable {
	
	int clientID;
	
	public Message(int id){
		this.clientID = id;
	}
	
	public int getID(){
		return clientID;
	}
}
```

Server:


```
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
	
	static ServerSocket serverSocket;
	static Socket socket;
	static ObjectOutputStream oos;

	public static void main(String[] args) {
		Message testmsg = new Message(23);
		try {
			System.out.println("Starte Server...");
			serverSocket = new ServerSocket(7777);
			System.out.println("Server online.");
		} catch (IOException e) {
			System.out.println("Probleme mit Serverinitialisierung.");
		}
		try {
			socket = serverSocket.accept();
			oos = new ObjectOutputStream(socket.getOutputStream());
		} catch (IOException e) {
			System.out.println("Konnte Verbindung zu Client nicht herstellen.");
		}
		try {
			oos.writeObject(testmsg);
		} catch (IOException e) {
			System.out.println("Fehler beim Senden der Nachricht.");
		} 
	}
}
```

Client:


```
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.UnknownHostException;


public class Client {
	
	static Socket socket;
	static ObjectInputStream ois;

	public static void main(String[] args) {
		Message input = null;
		try {
			socket = new Socket("localhost", 7777);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("Konnte Verbindung zu Server nicht herstellen.");
		}
		try {
			ois = new ObjectInputStream(socket.getInputStream());
		} catch (IOException e) {
			System.out.println("Inputstream konnte nicht aufgebaut werden.");
		}
		try {
			input = (Message) ois.readObject();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println("Message ID: " + input.getID());
	}
}
```

An sich ja relativ simpel, aber ich scheine irgendetwas zu übersehen, denn die Message kommt nicht an. Über Hilfe würde ich mich sehr freuen.


----------



## eRaaaa (4. Mai 2014)

Sollte so funktionieren. Was meinst du mit "Message kommt nicht an", woran machst du das fest? Was gibt der Client in Zeile 33 aus?


----------



## HerrJemineh (4. Mai 2014)

Den Stacktrace weiß ich gerade nicht mehr, denn ich habe das Problem "behoben".


```
ois = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
```

Wenn ich es so mache, funktioniert es. Würde jedoch mal gerne wissen, weshalb ich einen BufferedInputStream benötige. Weißt du es?


----------



## fischefr (11. Mai 2014)

Ich glaube, du machst da grundsätzlich einen schweren Fehler!
Deine Streams werden NIE richtig geschlossen. Dabei können gepufferte Daten bei OutputStreams verloren gehen, denn das Schließen führt implizit auch noch ein flush (Puffer leeren) mit sich. Korrigiert das mal! Ich würde das in einem finally-Block machen.


----------

