# komisches Problem / ObjectInputStream erstellt sich nicht



## cyberpunk (5. Sep 2009)

Hallo,
habe ein ein bisschen komisches Problem und komm einfach nicht weiter....
wäre euch super dankbar wenn ihr mir helfen könnt


Zum Code:

Es handelt sich um eine ganz normale Socket Verbindung, die ich erstellen will...
ich will jeweils einen 
BufferedReader in;
PrintStream out ;
ObjectOutputStream objOut;
ObjectInputStream objIn;

erstellen um sowohl einfach Strings als auch Objekte schicken zu können.




```
public class ClientConnectionTechnisch extends Thread{
	ClientConnectionController controller;
	BufferedReader in;
	PrintStream out ;
	ObjectOutputStream objOut;
	ObjectInputStream objIn;
	Socket client;
	boolean recieveObject=false;
	
	public ClientConnectionTechnisch( Socket client,ClientConnectionController controller){
		this.controller=controller;
		this.client=client;
		try
		{

			in = new BufferedReader(newInputStreamReader(client.getInputStream())); 
			System.out.println("ok");
			out = new PrintStream(client.getOutputStream());
			System.out.println("ok");
			objOut=newObjectOutputStream(newBufferedOutputStream(client.getOutputStream()));
			System.out.println("ok");
			
			objIn = new ObjectInputStream(new BufferedInputStream(client.getInputStream())); 
			System.out.println("ok");
		} catch (Exception e){}

		this.start();
	}
```


Das Problem was nun auftauch ist folgendes:
alle Input und Output Sachen werden im Konstruktor erstellt....
aber wenn es daran geht den letzten, den 	ObjectInputStream objIn zu erstellen geht es einfach nicht weiter....
auch an meiner Konsolenausgabe zu erkennen die ist : ok   ok   ok


nun frag ich mich, warum erstellt es denn den ObjectInputStream  nicht...?
Fehlermeldung gibt es keine...bleibt irgendwie anscheinend nur ewig da hängen


----------



## Michael... (5. Sep 2009)

cyberpunk hat gesagt.:


> Fehlermeldung gibt es keine...bleibt irgendwie anscheinend nur ewig da hängen


Dass er da hängen bleibt glaube ich nicht, dass keine Fehlermeldung ausgegeben wird schon, wenn ich mir folgende Zeile anschaue:


cyberpunk hat gesagt.:


> [JAVA=26]
> } catch (Exception e){}[/code]


----------



## cyberpunk (5. Sep 2009)

hi, ersma danke für deine Antwort,

guter Hinweis
nur leider hatte ich das Exception Handling der Übersicht halber hier rausgenommen 


```
objIn = new ObjectInputStream(new BufferedInputStream(client.getInputStream())); 
			System.out.println("ok");
		} catch (Exception e)
		{
			System.out.println("mhnnz");
			try {e.printStackTrace(); client.close(); } catch (Exception e2) {e2.printStackTrace();} ;	
			System.err.println("Fehler beim Erzeugen der Streams: " + e);
			return;
		}
		this.start();
```


sieht so aus in meinem Code
und wie gesagt Ausgabe ist nur:

ok
ok
ok

also muss es ja da hängen, weil sonst würd er ja das mhhnz von der Exception ausgeben oder das 4te ok



fällt dir vlt. sonst noch irgendwas ein
oder kommt dir noch was komisch vor ?
vielen Dank schonmal


----------



## cyberpunk (5. Sep 2009)

puhh ich habs endlich

beim ObjectInputStream und OutputOutputStream

musste der Part mit dem BufferedInputStream entfernt werden

also von

objIn = new ObjectInputStream(new BufferedInputStream(client.getInputStream())); 

auf 
objIn = new ObjectInputStream(client.getInputStream()); 


hmnnn aba Erklärung hab ich dafür keine ^^


----------



## cyberpunk (5. Sep 2009)

mhn mist es geht zwar nun aber es gibt Fehler ohne Ende....grml


vlt kann mir ja mal jmd gedanklich helfen:


also Idee war, dass man sowohl Strings als auch Objekte schicken kann
deswegen 
 BufferedReader in;
    PrintStream out ;
    ObjectOutputStream objOut;
    ObjectInputStream objIn;

diese beziehen sich alle entweder auf client.getInputStream() oder client.getOutputStream();

beim Empfangen mach ich das so, dass der BufferedReader in solange in der run des Threads mit in.readLine() weiter macht bis er eine Nachricht "sendObject" erhält
dann setzt er eine boolean Variable und es geht nicht mehr in in.readLine() sondern zu objIn.readObject() nachdem er das eine Object empfangen hat wird flag wieder zurück gesetzt


```
public void recieve(){
		
		if (!recieveObject) {
			String empfangenes="";
			try {
				empfangenes = in.readLine();
			} catch (IOException e) {
				e.printStackTrace();
				System.out.println("Fehler bei Datenempfang vom Client");
				controller.logout();
			}		
			if (empfangenes.equals("sendObject")) {
					recieveObject=true;
					return;
			}
			if ((empfangenes!=null)&&(empfangenes!="")){ 
				controller.verarbeite(empfangenes);
			}
		}
		
		if (recieveObject) {
			Table t=null;
			try {
				 t=(Table) objIn.readObject();
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println("Fehler bei Datenempfang vom Client");
				controller.logout();
			}
			
			recieveObject=false;
			controller.verarbeiteTable(t);
		}
	
	}
```

diese methode läuft dauerhaft in der run() des Threads




```
public void send(String nachricht) {
	    out.println(nachricht);
	    out.flush();
	}
	
	public void sendTable(Table table) {
			
			send("sendObject");
			try {
				objOut.writeObject(table);
				objOut.flush();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}
```

diese Methoden werden zum sendne der Ojekte (typ Table) und der Strings verwendet

man kann sich vorstellen, dass beide Seiten der Applikation gleich aussehen also recieve und send methoden in etwa gleich sind



das Problem ist, mir hat es Exceptions um die Ohren

und bei meinem Test, der so aussieht, dass ich die eine Seite erst einen String dann ein Objekt senden lasse
und dann das selbe auch die andere Seite 
läuft es so, dass teilweise nur der String ankommt, dann mal wieder String und Objekt 
oder aber auch eine Fehlermeldeung wie diese:


java.io.EOFException
	at java.ibjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2565)
	at java.ibjectInputStream.readObject0(ObjectInputStream.java:1308)
	at java.ibjectInputStream.readObject(ObjectInputStream.java:362)
	at ClientTechnisch.recieve(ClientTechnisch.java:74)
	at ClientTechnisch.run(ClientTechnisch.java:45)



mir ist das alles ein Rätsel...-.-


----------



## Spacerat (8. Sep 2009)

Lass den ganzen Reader / Writer-Kram einfach weg. Strings können auch über den ObjectStream geschickt werden. Im übrigen implementiert String auch das Interface Serializable.


----------

