# ObjectOutput- / ObjectInputStream Exception?



## raven (7. Jan 2007)

Hallo,  :wink: 

Ich versuche gerade ein Object übers Netzwerk zu verschicken, leider wirft er bei mir eine häßlich Exception.
Weiß einer von euch wie ich sie behandeln kann und wodurch sie ausgelöst wird. Hab schon gegooglet, aber leider nichts brauchbares gefunden.

Hier ein wenig Code:

Das ist mein Object, welches ich verschicken will.

```
import java.io.Serializable;

public class PlayerObject implements Serializable {

	public int x;
	public int y;
	public int w;
	public int h;

	public PlayerObject(int x, int y, int w, int h) {
		this.x = x;
		this.y = y;
		this.w = w;
		this.h = h;
	}
}
```


Die Client Klasse. hier verschicke ich das Object in einem Thread.

```
public PlayerObject playerObj;

	public static final int port = 4413;

	public Socket serverSocket;

	public OutputStream out;
	public ObjectOutputStream objectOut;

	public Client(Main main) {
		super();
		this.main = main;
		this.setBackground(Color.white);

		playerObj = new PlayerObject(100, 250, 30, 20);

		try {
			serverSocket = new Socket("localhost", port);
			out = serverSocket.getOutputStream();
			objectOut = new ObjectOutputStream(out);
		} catch (IOException e) {
			System.out.println("Connection to the Server missed: " + e);
			System.exit(1);
		}

		if (thread == null) {
			thread = new Thread(this);
			thread.start();
		}
	}

	public  void run() {
		while (true) {
			try {
				thread.sleep(70);
			}
			catch(InterruptedException e) {
				System.out.println("ERROR: " + e);
			}
			repaint();
			try {
				objectOut.writeObject(playerObj);
				objectOut.flush();
			} catch(IOException e) {
				System.out.println("Transmission missed: " + e);
			}
		}
	}
```



Meine Server klasse, speichert alle Connections in einem Vector

```
import java.net.*;
import java.io.*;
import java.util.*;

public class Server extends Thread {

	public static final int port = 4413;

	private ServerSocket serverSocket;

	private Vector connections;

	public Server() {
		try {
			serverSocket = new ServerSocket(port);
			System.out.println("Server running ...");
		} catch (IOException e) {
			System.err.println("Server could not be started. Server is terminated.");
			System.exit(1);
		}
		connections = new Vector();
	}

	public static void main(String[] args) {
		Server server = new Server();
		server.start();
	}

	public void run() {
		try {
			while(true) {
				Socket clientSocket = serverSocket.accept();
				Connection c = new Connection(this, clientSocket);
				connections.addElement(c);
				broadcast();
			}
		} catch (IOException e) {
			System.out.println("Connection to the Client missed: " + e);
			System.exit(1);
		}
	}

	public void broadcast() {
		Connection you;
		for (int i = 0; i < connections.size(); i++) {
			you = (Connection)connections.get(i);
			try {
				if(you.clientSocket.isClosed() != true) {
					you.objectOut.writeObject(you.object);
				}
			} catch(IOException e) {
				try {
					you.clientSocket.close();
					connections.remove(i);
				} catch (IOException e2) {
					System.out.println("Connection couldn't be closed: " + e2);
				}
				System.out.println("Transmission missed: " + e);
			}
		}
	}
}
```

Und meine Connection klasse

```
import java.net.*;
import java.io.*;

public class Connection extends Thread {

	private Server server;
	public Socket clientSocket;
	
	public OutputStream out;
	public ObjectOutputStream objectOut;
	public InputStream in;
	public ObjectInputStream objectIn;

	public PlayerObject object;

	public Connection(Server server, Socket clientSocket) {
		this.server = server;
		this.clientSocket = clientSocket;
		try {
			out = clientSocket.getOutputStream();
			objectOut = new ObjectOutputStream(out);
			in = clientSocket.getInputStream();
			objectIn = new ObjectInputStream(in);
		} catch (IOException e) {
			try {
				clientSocket.close();
			} catch (IOException e2) {
				System.err.println("Connection couldn't be closed: " + e2);
			}
			System.err.println("Transmission missed: " + e);
			return;
		}
		this.start();
	}

	public void run() {
		while(true) {
			try {
				object = (PlayerObject)objectIn.readObject();
			}
			catch (IOException e) {
				try {
					objectOut.close();
					out.close();
					objectIn.close();
					in.close();
					clientSocket.close();
				} catch (IOException e2) {
					System.err.println("Connection couldn't be closed: " + e2);
				}
				System.err.println(e);
			}
    			catch (ClassNotFoundException e) {
				try {
					objectOut.close();
					out.close();
					objectIn.close();
					in.close();
					clientSocket.close();
				} catch (IOException e2) {
					System.err.println("Connection couldn't be closed: " + e2);
				}
				System.err.println(e);
			}
		}
	}
}
```

Hoffe einer von euch kann mir einen guten Tipp geben, wie ich die Exception beseitigen kann.

mfg X_Master


----------



## SlaterB (7. Jan 2007)

erzähl doch mal was für eine Exception kommt?!
beim Client oder Server?

ich vermute stark, dass beim Deserialisieren kein Objekt erzeugt werden kann,
weil der Default-Konstruktor
public PlayerObject() { 
}

fehlt, 
den anderen zu nutzen ist etwas zu hoch für automatisierte Java-Prozesse..

-------

Tipp:
anfangs auch mal mit einfachen vorgegebenen Objekten wie String/ Integer testen,
wenn du das getan hattest es mit diesen geht, dann wäre das eine wichtige Info gewesen..


----------



## raven (7. Jan 2007)

Diese Exception wird geworfen. java.net.SocketException: Connection reset

Ich hab was vergessen zu sagen. Die Exception wird nur geworfen, wenn ich den Clienten schließen. Wie kann ich die aber abfangen.
Ich habe schon versucht, wenn die Ecxeption ausgeworfen wir, die Verbindung zu schließen, hilft aber nicht.

EDIT: wird beim Server geworfen.

mfg X_Master


----------

