ObjectInputStream hängt ganzes Programm auf...

  • Themenstarter Themenstarter Goldfish
  • Beginndatum Beginndatum
G

Goldfish

Gast
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
 
Hi,

das sollte nicht passieren.

Vieleicht mehr Code posten?

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

Gruß,

Martin
 
Versuch mal die Reihenfolge von OIS und OOS auszuwechseln. So ein ähnliches (oder das selbe) Problem hatte ich vor ca. einen Jahr einmal.
 
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 ^^
 
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 😉
 
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 ^^
 
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
 

Neue Themen


Zurück
Oben