ObjectInputStream öffnet nicht

wootey

Mitglied
Hallo, ich schreibe momentan einen Client für einen Kalender, der auf einem Server LinkedLists speichern soll. Doch beim Erstellen des Clientobjekts wird der ObjectInputStream nicht geöffnet. Wirft aber keine Exceptions oder so.

Hier der Code der Clientklasse:
Java:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.LinkedList;
import java.util.Scanner;


public class Client {

	private String host;
	private int port;
	private String name;
	
	private Calendar cal = new Calendar();
	private ObjectOutputStream out;
	private Socket server;
	private ObjectInputStream in;

	
	public Client(String h, int p){
		host = h;
		port = p;
		
		try {
			System.out.println("im try catch");
			server = new Socket(host, port);
			System.out.println("new socket");
			out = new ObjectOutputStream(server.getOutputStream());
			System.out.println("output stream");
			in = new ObjectInputStream(server.getInputStream());
			System.out.println("input stream");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
	public Client(){
		
	}
	
public void send(Object m){
		
		try {
			
			out.writeObject(m);
			
			Object o = in.readObject();
			
			
			if(o == null){
				startGUI();
			}
			else {
				if(o instanceof LinkedList){
					System.out.println("Terminliste von Server empfangen!");
					cal.setList((LinkedList<Date>)o);
					
					startGUI();
				}
				if(o instanceof Integer){
					if(o.equals(1)){
						System.out.println("Liste erfolgreich vom Server empfangen");
					}
				}
				
			}
			
			
			
			out.close();
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void startGUI(){
		System.out.println("GUI wird gestartet...");
		GuiCal a = new GuiCal();
		a.setVisible(true);
		
	}
	
	public int getPort(){
		return port;
	}
	
	public String getHost(){
		return host;
	}
	
	public static void main(String[] args) {

		Client temp = new Client();
		System.out.println("Bitte geben Sie die Server IP ein: ");
		Scanner scanIP = new Scanner(System.in);
		temp.host = scanIP.nextLine();
		System.out.println("Bitte geben Sie den Port ein: ");
		Scanner scanPort = new Scanner(System.in);
		temp.port = scanPort.nextInt();
		String ip = temp.host;
		int port = temp.port;
		
		Client c = new Client(ip, port);
		System.out.println("Login Name: ");
		Scanner scanName = new Scanner(System.in);
		c.name = scanName.nextLine();
		

		c.send(c.name);
		
		
	}

}

Und hier die Serverklasse:

Java:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Scanner;


public class Server {

	int port = 8888;
	ServerSocket socket;
	HashMap<String, Calendar> hashmap = new HashMap<String, Calendar>();
	
	public Server () {
		try {
			socket = new ServerSocket(port);
//			Calendar calendar = new Calendar();
			System.out.println("Server gestartet...");
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		while(true){
			listen();
		}
	}
	
	
	public static void main(String[] args) {
		
		new Server();
		
	}
	
	
	public void listen(){
		try {
			Socket client = socket.accept();
			ObjectInputStream in = new ObjectInputStream(client.getInputStream());
			
			
			Object o =in.readObject();
			ObjectOutputStream out = new ObjectOutputStream(client.getOutputStream());
			
			if(o instanceof String){

				out.writeObject(hashmap.get((String)o));

			}
			
			else {
				if (o instanceof LinkedList){
					System.out.println("Der Client sendet eine Liste...");
					LinkedList<Date> list = new LinkedList<Date>();
					list = (LinkedList<Date>)o;
					out.writeObject(1);
					
				}
				
			}
			
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public boolean nameVorhanden(String calname){
		
		if(hashmap.get(calname)==null){
			return false;
		}
		else{
			return true;
		}
		
	}
	

}
 
Zuletzt bearbeitet:
muss am Server liegen, ist der zufällig auch dein Code?

----

einen temp-Client anzulegen nur um dessen Attribute als Variablen zu benutzen,
diese dann aber extra noch in lokale Variablen zu kopieren (warum nicht gleich dort?)
um sie letztlich einem richtigen Client unterzubringen ist schräg

ständig neuer Scanner auch nicht nötig
 
Habe den Servercode in den Anfangspost editiert.

Fand ich auch sehr komisch, als ich damit angefangen hab^^. Wollte aber static vermeiden und wusste nicht wie ichs sonst machen soll.

Danke schon einmal.
 
dann ist es klar:
der ObjectInputStream liest gleich in seinem Konstruktor etwas von der Gegenseite,
wenn da nichts kommt weil kein OutputStream definiert, dann Blockade

der klassische Fehler ist, dass beide Seiten erst den ObjectInputStream definieren und beide Seiten
auf den ObjectOutput warten, der aber jeweils erst eine Zeile später kommt,

das ist bei dir nicht der Fall, denn ich sah dass du auf Client-Seite erst richtig out definiert hast,
damit könnte der Server entweder selber sowieso auch schon sein out definieren, oder falls erst Input könnte dieser gleich
den Anfang lesen und dann eben out,

du hast es aber so gebaut, dass beim InputStream nicht nur auf die Anfangs-Token, sondern gleich auf ein ganzes Objekt
gewartet wird, welches der Client noch nicht senden kann, da dessen Input auf Deklaration des Output im Server wartet,
welche erst später erfolgt

lange Rede, kurzer Sinn 😉 :
Zeile 47 im Server muss etwas weiter höher, zur Sicherheit noch vor die Deklaration des InputStreams, also in Zeile 43
 

Neue Themen


Zurück
Oben