ObjectOutputStream / ObjectInputStream über Sockets

TheBodo

Erfahrenes Mitglied
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:

Java:
/**
 * 
 */
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:

Java:
/**
 * 
 */
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
 
Hi,

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

Welche Exeption wird eigenlich gewurfen?

hmf
 
@ 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!
 
Zuletzt bearbeitet:
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?
 
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!
 
Zurück