# problem beim schließen eines Streams



## PrinzMartin (14. Okt 2007)

Moin Moin ich habe einen Server und dort gibt es einen Thread, der immer wenn von einem Client eine Nachricht kommt, diese an alle anderen senden.........

soweit so bevor der Quelltext kommt noch ein paar erläuterungen zu eben diesen...

falls ihr euch über die eingabe wundert, das soll das empfangen einer Nachricht darstellen, da momentan der Client noch nicht so ausgereift ist.... also alles was jetzt eintritt sobald was eingegeben wurde, soll später eintreten wenn der Client sendet....

Das ganze läuft aber noch nicht so richtig denn wenn ich mir die Exception in der senden Methode ausgeben lasse kommt da als Fehler:

java.net.SocketException: Socket is closed

und das nicht einmal sondern naja als ob ich es in einer while schleife ausgebe......... und das kommt nur, wenn ich das 

out.close; da stehen habe ansonsten kommt der fehler nicht, aber beim Client auch nix an, da der nicht erkennt, dass die gesendete Zeile zu ende ist..

ich wunder mich, da out.close(); ja eigentlich den Outputstream schließen soll und nicht den socket....
außerdem wenn ich mir in der Exception mal statt der Exception "socket" ausgeben lasse, dann kommt der ganz normal also kein [unconected] oder ähnliches...


```
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 14.10.2007
  * @author
  */
import java.lang.*;
import java.io.*;
import java.net.*;
import java.util.Scanner;

public class tRead implements Runnable
{

  // Anfang Variablen
  cList socket_list;
  Socket socket;
  BufferedReader in;
  PrintWriter out;
  String msg;
  Scanner eingabe;
  // Ende Variablen

  // Anfang Ereignisprozeduren
  public tRead(cList pList, Socket pSocket)
  {
    this.socket_list = pList;
    this.socket = pSocket;
    eingabe = new Scanner(System.in);
  }
  
  public void run()
  {

    try
    {
      in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

      
      System.out.println("gib was ein um zu senden");
      msg = eingabe.next();
      System.out.println("hast gut eingegeben");
      
         //while (!in.ready()) {}        //**********das soll nachher die eingabe ersetzen
         senden();
      
    } catch (IOException e)
    {
        
    }

  }
  
  public void senden()
  {

    socket_list.toFirst();
    while(!socket_list.isBehind())                  //**************hier sind alle sockets drin gespeichert....
    {
      try
      {
        socket = (java.net.Socket)socket_list.getItem();        
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        out.write("hallo meine welt");

        System.out.println(String.valueOf(socket_list.getItem())+"   Message: "+msg);
        socket_list.next();
        out.close();                                     //*********ja hier scheint das problem zu sein aber ich muss den
                                                             //*********Stream ja schließen, damit readLine ein ende erkennt
       } catch (IOException e)                     
      {
        System.out.println(e);                    //*********naja die Exception sagt das der socket "geclosed" ist
      }
    }
  }

  // Ende Ereignisprozeduren
}
```


Außerdem, wenn ich einen Client habe funktioniert es ganz wunderbar, es funktioniert eigentlich auch bei mehreren Clients da kommt dann zwar die Exception aber er sendet ganz brav...

und mich wundert, dass ich erst beide eingaben machen muss (bei zwei clients) bevor der die senden methode aufruft....

eigentlich sollten die Threads doch nebeneinander ablaufen und wenn ich dann eine eingabe mache, müsste es doch in dem Thread weitergehen oder ?



ich hoffe ich mache euch nicht zu viel Arbeit und ihr wisst hilfe ich sitz da schon seit heute morgen dran

grazie in anticipo


----------



## Murray (14. Okt 2007)

Mach mal statt close() flush().


----------



## PrinzMartin (14. Okt 2007)

hab ich auch gedacht das tuts nicht vllt weil ich einen PrintWriter benutze?

soll ich eher den BufferedWriter nehmen? aber in dem Server beispiel war es ein PrintWriter deshalb hab ich den übernommen....................


aber wie gesagt ist das ganze programm krumm da der eine Thread auf den anderen zu warten scheint.......

wie gesagt wenn ich zwei clients starte steht da halt zweimal 

bitte was eingeben um zu senden

is ja klar, da ich für jeden Thread jetzt eine eingabe machen muss damit es weitergeht...

wenn ich jetzt aber eine eingabe mache, müsste doch ein Thread weitermachen und senden oder?
Das tut er aber nicht es geht erst weiter, wenn ich auch für den zweiten Thread eine eingabe mache...


----------



## PrinzMartin (14. Okt 2007)

Ich gebe mal den Client hier an, da das die gleiche Exception ist, aber nur eine klasse also vllt einfacher den Fehler zu finden:


```
import java.lang.*;
import java.io.*;
import java.util.*;
import java.net.*;

class Client {
   public static void main(String args[]) {
      try {
          Socket socket = new Socket("localhost", 1234);

          PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

          System.out.print("Received string: ");
          Scanner eingabe;
          eingabe = new Scanner(System.in);
          String msg;
          msg = eingabe.next();
          out.write(msg);
          out.close();

         System.out.println("gesendet");

         BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
         //********wenn ich den BufferedReader am anfang der Klasse erstelle also unter dem PrintWriter
         //********dann gibt es keinen Fehler aber er sendet auch nicht........ 
         //********auch out.flush() erzielt keine wirkung ich weiß echt nicht mehr weiter..
         while (!in.ready()) {}
         System.out.println(in.readLine()); // Read one line and output it

         System.out.print("\n");

         in.close();
      }
      catch(IOException e) {
         System.out.print(e);
      }
   }
}
```


----------



## PrinzMartin (14. Okt 2007)

Es wird immer komischer wenn ich beim Client statt out.close();
out.flush() nehme, dann geht es der Server erkennt, das was gesendet wurde geht an der while(!readLine.in){} schleife vorbei und sendet dann...................

wenn ich allerdings beim Server out.flush(); nehme, dann geht er nicht an der  while(!readLine.in){} schleife vorbei...

Ich glaub ich muss den ganzen Code noch mal durchgehen ich blick echt nicht mehr durch...


Außerdem kommt immer noch bei manchen Server Client konstellationen die meldung, dass der socket geschlossen ist oder ne andere meldung, dass ne verbindung nicht klappt............... dabei wird der socket im gesamten programm nicht beendet in keinster weise....... ich glaub ich mach jetzt noch meine Deutsch LK Hausaufgaben vllt kommt dann ja ne lösung in mein Hirn    oder ihr wisst hilfe

danke schon mal



 :meld:  :meld:  :meld: EEEDDDIIITTT : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  - - - - 

Soooooo alle probleme gelöst, ich verstehe es immer noch nicht aber ich sende einfach einen Zeilenumbruch das hilft...
also 


```
out.println();
```

Das scheint wunderbar zu laufen...


----------



## tuxedo (15. Okt 2007)

Wenn der Server keinen Zeilenumbruch sendet, du aber beim Client auf einen Zeilenumbruch wartest, ist das doch klar, oder?


----------



## PrinzMartin (15. Okt 2007)

naja wenn ich das .close() benutzt habe, dann hat der ja auch gemerkt, dass ende ist und vom Client aus ging ja .flush(); dann hat der auch gemerkt, dass jetzt die Zeile zu ende ist.

Nur vom Server zum Client ging .flush(); ja nicht was mich halt gewundert hat und auf die einfachste Lösung bin ich halt nicht gekommen^^ aber das nächste Problem kommt bestimmt  :wink:


----------

