# ObjectInputStream hängt ganzes Programm auf...



## Goldfish (10. Jul 2011)

Hi Leute, ich hab ein gewaltiges Problem dass ich mir nicht erklären kann. Ich habe ein Programm dass sich an einer bestimmten Stelle immer aufhängt, ohne mir eine Fehlermeldung zu geben oder das Programm zu beenden. Es bleibt einfach stehen. Die Stelle konnte ich genau bestimmen. Ich zeig das hier mal eben

[JAVA=42]
public NetworkStore(Socket sock){
    try{
input = new ObjectInputStream(sock.getInputStream());
      output = new ObjectOutputStream(sock.getOutputStream());
    }catch(IOException ex){
       System.out.println(ex.getStackTrace());
     }
  }
[/code]

Die rot markierte Stelle ist es, an der nichts mehr weiter geht.... Ich bin mit meinem Latein auch wirklich am Ende. Wäre echt super, wenn mir jemand helfen könnte...

Danke im Voraus


----------



## Marcinek (10. Jul 2011)

Hi,

das sollte nicht passieren.

Vieleicht mehr Code posten?

Kann es sein, dass die blockierende Stelle an .accept() ist? und da sowas passiert: 
	
	
	
	





```
new worker(ss.accept());
```

Gruß,

Martin


----------



## Volvagia (10. Jul 2011)

Versuch mal die Reihenfolge von OIS und OOS auszuwechseln. So ein ähnliches (oder das selbe) Problem hatte ich vor ca. einen Jahr einmal.


----------



## Goldfish (10. Jul 2011)

Ich fass es nicht, das hat echt geklappt, das auswechseln der Reihenfolge...
Danke dir ^^
Aber normal ist das ja eigentlich nicht. Was mich daran auch echt verrückt gemacht hat. Ich habe das in einem anderen Programm schonmal genauso gemacht, wie es da eben stand und da funktioniert es auch jetzt noch wunderbar, deswgeen konnte ich mir das beim besten Willen nicht erklären ^^

Danke danke ^^


----------



## Kr0e (10. Jul 2011)

Das ist nix magisches... Dafür gibts ne super einfache Erklärung, wenn man einfach mal einen Blick in den Source wirft...

Ein ObjectInputStream liest bei Erstellung 2 short Werte. Da auf beiden Seiten der Input zuerst erstellt wrid gibts nen DEadLock... Also als Grundregel: IMMER den Output zuerst


----------



## Goldfish (10. Jul 2011)

Ich bin mit der Theorie dahinter nicht wirklich vertraut, daher bin ich mir gerade nicht ganz sicher, wie der source gerade aussehen mag und wieso das deshalb in einen Deadlock läuft. Aber ich werds mir für die Zukunft merken.  Super, dass es hier genug Leute gibt, die sich auskennen ^^


----------



## Kr0e (10. Jul 2011)

Also:

Der ObjectInputStream liest bei der Erstellung des Objectes direkt 2 Short Werte aus dem Stream. Die ReadMethoden sind so programmiert, dass sie blockiern, wenn nix zum Lesen da ist. Wenn auf beiten Seiten (Client und Server) jeweils der ObjectInputStream zuerst erstellt wird, dann hängen beide Prorgamme bei der ReadMethode fest. Andersrum ist perfekt: Beide ObjectOutputStream schreiben erstmal 2 Zeichen in den Stream. Diese Daten wandern schonmal auf die adnere Seite und warten dann jeweils in den Puffern der Sockets. Wenn dann auf beiden Seiten der ObjectInputStrem erstellt wird, lesen die direkt die Zeichen aus den Socket Puffern ein und bleiben cniht hängen.

Gruß,

Chris


----------



## Goldfish (10. Jul 2011)

okay, das war super erklärt, jetzt hab ichs begriffen und jetzt ergibts auch Sinn für mich.^^
Danke nochmal ^.^


----------

