# ObjectOutputStream / ObjectInputStream über Sockets



## TheBodo (18. April 2008)

Moinsen,

ich habe ein kleines Problem mit meinen Sockets und den ObjectStreams.
Ich starte ganz normal den Server und den Client, aber sobald er beim Client den ObjectInputStream aus dem server.getInputStream holen soll, bricht er ab, hier mal der Quellcode:


```
/**
 * 
 */
package server;

import input.Input;

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

/**
 * This class runs the server, which manages the users and their ips.
 * 
 * @author Christoph Englich
 *
 */
public class IMServer extends Thread {

	int status = 0;
	
	private ServerSocket server = new ServerSocket(3887);
	
	public IMServer() throws IOException {
		this.status = 1;
		this.start();
		String s;
		while (status == 1) {
			s = Input.rS("Waiting for command:");
			if (s.equals("stop")) {
				this.status = 0;
			} else {
			}
		}
	}
	
	public void run() {
		while(status == 1) {
			Socket client;
			try {
				server.setSoTimeout(1000);
				client = server.accept();
				ObjectInputStream input = new ObjectInputStream (client.getInputStream());
				ObjectOutputStream  output = new ObjectOutputStream (client.getOutputStream());
				String a = (String) input.readObject();
				System.out.println(a);
				output.writeObject(a);
				output.flush();
				input.close();
				output.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				//e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			IMServer server = new IMServer();
			//server.start();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
```

Und hier der Client:


```
/**
 * 
 */
package client;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

/**
 * @author Christoph Englich
 *
 */
public class Client {

	
	Socket server;

	public Client() throws IOException {
		
		String x = "Bitte \n nach \n Hause \n gehen!";
		System.out.println(1);
		server = new Socket("localhost", 3887);
		System.out.println(2);
		ObjectInputStream input = new ObjectInputStream (server.getInputStream());
		System.out.println(3);
		ObjectOutputStream output = new ObjectOutputStream (server.getOutputStream());
		System.out.println(4);
		output.writeObject(x);
		System.out.println(5);
		output.flush();
		try {
			System.out.println(input.readObject());
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		input.close();
		output.close();
		server.close();		
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			Client client = new Client();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
```

Die System.out.println(); sind drin, damit man gucken kann wann er abbricht, und die 2 gibt er noch aus, die 3 aber nicht mehr! Woran kann das liegen?

Mfg Bodo


----------



## Adrian_Broher (18. April 2008)

Wieso ist beim Server der Ausdruck des Stacktraces bei der IOException auskommentiert?


----------



## _jsd_ (18. April 2008)

Hi,

darf man fragen was Du damit bezwecken willst? Vielleicht wäre RMI oder ein einfache Outputstream besser.

Welche Exeption wird eigenlich gewurfen?

hmf


----------



## TheBodo (18. April 2008)

@ Adrian Boher
Der wirft sonst jede Sekunde nen Timeout als Exception raus und das ist bei längerem Serverbetrieb nervig, wenn ich es aber reinsetzte, dann passiert gar nichts, also der bleibt einfach hägen im Programm bis ich den Client schließe!

@_jsd_ Ich will halbwegs komfortabel Strings mit Zeilenumbrüchen austauschen, was über BufferedReader und readLine() nicht gut ginge!


----------



## Adrian_Broher (18. April 2008)

TheBodo hat gesagt.:


> @ Adrian Boher
> Der wirft sonst jede Sekunde nen Timeout als Exception raus und das ist bei längerem Serverbetrieb nervig, wenn ich es aber reinsetzte, dann passiert gar nichts, also der bleibt einfach hägen im Programm bis ich den Client schließe!



Er macht genau das was du ihm sagst.

http://java.sun.com/j2se/1.4.2/docs/api/java/net/Socket.html#setSoTimeout(int)


----------



## TheBodo (18. April 2008)

Ja schon klar, aber das Timout muss rein damit der server per befehlt stoppbar ist. Deswegen fange ich die Exception. Mittlerweile per SocketTimoutException...

Habe den Fehler eingrenzen können und zwar auf den InputStream!! hat da einer ne Ahnung?


----------



## _jsd_ (18. April 2008)

TheBodo hat gesagt.:


> @_jsd_ Ich will halbwegs komfortabel Strings mit Zeilenumbrüchen austauschen, was über BufferedReader und readLine() nicht gut ginge!



hmmm, deswegen RMI, kompfortabler gehts da echt net , ohne Basteln und Timeouts, und das allerbeste ist, der Server ist auch beendbar 

hmf


----------



## TheBodo (18. April 2008)

vlt guck ich es mir mal an, aber ws funktioniert jetzt, und zwar nur durch vertauschen der Initialisierung von Input und OutputStream!

aber Danke an euch!


----------

