# Problem mit Socket-Verbindung



## Marco123 (15. Mai 2011)

Hallo,

ich schreibe gerade eine einfache Client-Server-Anwendung, bei der Nachrichten per PrintWriter und BufferedReader zwischen Server und Client hin- und hergeschickt werden sollen.

Sowohl Server als auch Client enthalten dafür die folgenden beiden Methoden, denen jeweils der vorher erzeugte Socket, über den sich Client und Server verbunden haben, übergeben wird:


```
// Methode, die eine Nachricht per PrintWriter in den Socket schreibt
  private void schreibe (Socket s, String nachricht) {
    try {
      // PrintWriter erzeugen
      PrintWriter pWriter =
        new PrintWriter(
          new OutputStreamWriter(
            s.getOutputStream() ));   
      // Nachricht senden
      pWriter.print(nachricht);
    }
    catch (IOException e) {
      System.out.println("IOException!");
    }
  }
  
  // Methode, die eine Nachricht per BufferedReader aus dem Socket einliest und an die aufrufende Methode zurückgibt
  private String lese (Socket s) {
    // Paltzhalter für die zu empfangende Nachricht
    String nachricht = "";
    try {
      // BufferedReader erzeugen
      BufferedReader bReader =
        new BufferedReader(
          new InputStreamReader(
            s.getInputStream() ));
      // Nachricht empfangen
      nachricht = bReader.readLine();
    }
    catch (IOException e) {
      System.out.println("IOException!");
    }
    // Nachricht zurückgeben
    return nachricht;
  }
```

Wenn ich das Programm mit diesen Methoden ausführe, sendet der Client eine Nachricht an den Server. Die Server-Anwendung empfängt die Nachricht jedoch nicht und bleibt einfach "stehen".

Nun habe ich schon eine Weile gegooglet und herausgefunden, dass ich die schreibe-Methoden nach dem Senden der Nachricht um ein 
	
	
	
	





```
pWriter.close();
```
 ergänzen muss.

Obwohl ich nicht ganz verstanden habe warum, wird die Nachricht nun vom Server empfangen und dieser schickt eine Nachricht an den Client zurück. Jetzt empfängt der Client die Nachricht jedoch nicht mehr (bzw. nur noch eine leere Nachricht), mit der Begründung "Socket is closed". Scheinbar wurde beim Schließen des PrintWriters gleich der ganze Socket geschlossen, den ich jedoch für die weitere Kommunikation zwischen Client und Server noch brauche.

Gibt es eine Möglichkeit den PrintWriter zu schließen (warum muss man das überhaupt tun?), ohne den Socket mit zu schließen?


----------



## Lumaraf (15. Mai 2011)

readLine() liest Daten bis ein Zeilenumbruch kommt oder der Stream geschlossen wird der Aufruf pWriter.print(nachricht); läßt vermuten das der erwartete Zeilenumbruch nie kommt.
BufferedReader und InputStreamReader lesen unter Umständen mehr Daten aus dem Socket als in dem Aufruf der lese(Socket) Methode verarbeitet werden. Es sollte für das Socket nur einmal ein BufferedReader erzeugt werden der dann für alle lesenden Zugriffe auf das Socket verwendet wird.
Die Klasse PrintWriter gibt die Daten nur an den OuputStreamWriter weiter wenn ein Zeilenumbruch geschrieben wird, PrintWriter.flush() aufrufen wird oder der PrintWriter via PrintWriter.close() geschlossen wird.


----------



## despikeexd (16. Mai 2011)

mal davon abgesehen das solche blockierenden methoden eh in getrennten threads ablaufen sollten ...
aber ein einfaches client-server - chat-beispiel liefert google zu hauf ... nur das mit dem Stream.close() ist lustig ... probiers mal aus und beobachte das verhalten ...


----------

