# Server-Client IO Problem



## GummiBrot (23. Jan 2018)

Hallo,

ich programmiere gerade eine sehr einfache Chatanwendung, in der sich Clients per Socket mit einem Server verbinden und dann Nachrichten austauschen können. Der Server bedient die Clients in eigenen Threads, ich habe dafür eine eigene Klasse erstellt und die Verbindung steht wohl. Nachdem sich ein Client verbunden hat soll er einen Verbindungsbericht an den Server schicken. Der Output sieht so aus:


```
socket = new Socket("localhost", 12448)

    //Verbindungsbericht
    OutputStream out = socket.getOutputStream();
    PrintWriter pw = new PrintWriter(out);
    BufferedWriter bw = new BufferedWriter(pw);
    bw.write("connect:" + name );
    System.out.println("Der Verbindungsbericht wurde an den Server gesendet");
```

Durch die letzte Zeile überprüfe ich, ob das Programm bis hierhin kommt(Ja das tut es).

Auf der Serverseite wartet das  Programm im Thread auf den Eingang von Nachrichten:


```
System.out.println("Verbinde...");
    socket = server.getServerSocket().accept();

    InputStream in = socket.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(in));

    System.out.println("Warte auf Eingabe");

    while(true) {

        while (br.ready()) {
            System.out.println(br.readLine());

            String text = br.readLine();
            if (!(text.equals(""))) {
                System.out.println("Nachricht empfangen");
                empfangeNachricht(text);
            }
        }
    }
```

Da auf der Konsole "Warte auf Eingabe" erscheint, gehe ich davon aus, dass die Verbindung erfolgreich hergestellt wurde. Es wird jedoch nie "Nachricht empfangen" ausgegeben.
Das sollte allerdings passieren, wenn der Client einen nichtleeren String sendet.

Nun ist meine Annahme, dass ich irgendwo einen Fehler beim Input/Output gemacht habe.
Ich kann ihn leider nicht finden und wende mich daher an dieses Forum.

Wenn Euch auffällt, wo sich ein Fehler befindet wäre ich euch dankbar, wenn ihr mir das mitteilen könntet.

Gruß
GummiBrot


----------



## Flown (23. Jan 2018)

GummiBrot hat gesagt.:


> System.out.println(br.readLine());
> String text = br.readLine();


Du möchtest schon mal 2 Zeilen lesen. Ist falsch.

Möglicher Fehler ist, das dein OutputStream noch nicht geflushed wurde.


----------



## GummiBrot (24. Jan 2018)

Ich habe das readLine mal aus dem print Befehl genommen und stattdessen text ausgeben lassen,
ist ja dann dasselbe mit nur 1 mal Zeile lesen.

Ich habe mal out.flush() direkt unter die Initialisierung von out gesetzt, hat aber leider nichts geholfen.

Trotzdem Danke für deine Antwort


----------



## fhoffmann (24. Jan 2018)

GummiBrot hat gesagt.:


> Ich habe mal out.flush() direkt unter die Initialisierung von out gesetzt


Natürlich bringt das nichts. Du musst nach dem Schreiben ein flush() machen:

```
bw.write("connect:" + name );
bw.newLine();
bw.flush();
```


----------



## GummiBrot (24. Jan 2018)

Auch das hat leider nicht zum gewünschten Ergebnis geführt.


----------



## GummiBrot (24. Jan 2018)

Vergiss, was ich geschrieben hab, ich habe versehentlich out.flush statt bw.flush geschrieben.
Jetzt kommt tatsächlich etwas an. Ich danke Dir


----------



## JuKu (7. Feb 2018)

GummiBrot hat gesagt.:


> Der Server bedient die Clients in eigenen Threads, ich habe dafür eine eigene Klasse erstellt und die Verbindung steht wohl.



Falls du mehr als 10 Clients hast ist das eig. gar keine gute Idee.
Du benötigst früher oder später Thread Pools.
Desweiteren ist es oftmals nicht sinnvoll, das ganze manuell mit Java NIO zu machen.

Ich verweise einmal wieder auf meine beiden Tutorials, wie man einen Chat Server + Client schreibt:

*[Tutorial] Ein Chat Server in Java – Teil 1 / 2*
*[Tutorial] Ein Chat Server in Java – Teil 2 / 2*

Für so etwas gibt es Libraries wie Vertx, die einem das Low Level Zeug abnehmen.


----------

