komisches Problem / ObjectInputStream erstellt sich nicht

Status
Nicht offen für weitere Antworten.

cyberpunk

Mitglied
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.



Java:
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
 
hi, ersma danke für deine Antwort,

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

Java:
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
 
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 ^^
 
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

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



Java:
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.i😵bjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2565)
at java.i😵bjectInputStream.readObject0(ObjectInputStream.java:1308)
at java.i😵bjectInputStream.readObject(ObjectInputStream.java:362)
at ClientTechnisch.recieve(ClientTechnisch.java:74)
at ClientTechnisch.run(ClientTechnisch.java:45)



mir ist das alles ein Rätsel...-.-
 
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.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben