# Netzwerkchat Problem: Mehrere Nachrichten ~ Anfängerproblem



## Tim S. (30. Apr 2009)

Ich arbeite momentan in der Schule an einem Java projekt. Es ist das erste mal, dass ich mit Java richtig in Kontakt komme. Deswegen habe ich auch über die Suchfunktion mich nicht wirklich zurecht gefunden.

Als Ziel habe ich mir gesetzt, einen kleinen Netzwerk chat zu programmieren, bestehend aus einem Server und einem Client, da ich soetwas bereits in einem VHS-Kurs gemacht, jedoch nicht verstanden habe. Ich bin auch schon "relativ" weit. Die Verbindung kann von einem PC zum anderen hergestellt werden und auch eine Nachricht verschickt werden.
Wenn "exit eingegeben wird, beendet sich das Programm.

Nun stehe ich jedoch vor dem Problem, dass der Server nur eine einzige Nachricht auswirft und ich ratlos bin warum. ;(

Es funktioniert auch bisher nur in eine Richtung, das macht jedoch nichts. Im moment will ich erst einmal mehrere Nachrichten verschicken können.

Hier der Server:


```
import java.net.*;
import java.io.*;
public class SimpleServer1
{
    public static void main(String[] args)    {
        try
        {
            //Der Port 5555 wird geöffnet und auf den request gewartet...

            //...der request ist erfolgt. Ein BufferedReader liest die Daten
            //aus dem InputStream der Socket und gibt sie aus...
               String outdata;
               String Vergleich;
               Vergleich = "exit";
               ServerSocket ss = new ServerSocket(5556);
               Socket s = ss.accept();
               
            do {
                        
                BufferedReader br = new BufferedReader(
               new InputStreamReader(s.getInputStream()));
               //String outdata;
               outdata = br.readLine();

               if (outdata == null)
               {
                }
                else
                 {
                  System.out.println("Incoming message: " + outdata);
                 }

            }  while (!Vergleich.equals( outdata ));

             s.close();

            //System.out.println("Incoming message: " + br.readLine());
            //schließlich wird die Socket wieder geschlossen (!) ...
            //
       }
       catch(IOException e)
       {
          System.err.println(e.toString());
       }
    }
}
```

Und der Client:


```
import java.net.*;
import java.io.*;
public class SimpleClient1
{
    public static void main(String[] args)
    {
       String Vergleich;
       Vergleich = "exit";
       String inData;
       inData = "blubb";
   do {

        try
        {
            //selbst
              InputStreamReader inStream =
              new InputStreamReader( System.in ) ;
            BufferedReader stdin =
            new BufferedReader( inStream );

            System.out.println("Geben Sie Daten ein:");
            inData = stdin.readLine();

            //Eine Socket wird zum eigenen Rechner (localhost) aufgebaut...
            Socket s = new Socket("localhost", 5556);
            //Der PrintWriter versendet nun über den OutputStream der
            //Socket einen String...
            PrintWriter pw = new PrintWriter(s.getOutputStream());
            pw.print( inData );
            pw.flush();
            s.close();

            //String Vergleich;
            //Vergleich = "exit";

        }
        catch(IOException e)
        {
            System.err.println(e.toString());
        }
       }while (!inData.equals( Vergleich ));
             
    }
}
```

Das Problem ist wie gesagt, dass das mein erster Kontakt mit Java ist und ich nicht in der Lage bin mir selbst zu helfen. :bahnhof:

Vielen Dank schonmal im vorraus.


----------



## SlaterB (30. Apr 2009)

du solltest nicht so viele Streams erstellen,
stell dir vor, der Client sendet zwei Zeilen auf einmal,

ein
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
liest dann sofort beide Zeilen in seinen internen Speicher,
eine davon gibst du aus, die andere nicht,
im nächsten Schleifendurchlauf will ein neuer BufferedReader von s.getInputStream() lesen, aber da ist keine zweite Zeile mehr, die hatte der erste BufferedReader schon gelesen

generell also nur EINEN InputStream + OutputStream auf Sockets + System.in,
in einer Schleife möglichst keine Streams definieren, es sei denn natürlich du definierst den Socket in jedem Schleifendurchlauf neu

--------

aber eigentlich sollte hier den Server gar keine Nachricht erreichen,
> outdata = br.readLine();
liest nämlich so lange, bis ein Zeilenumbruch \n erscheint,

aber der Client sendet nie einen Zeilenumbruch

>        pw.print( inData );

->

        pw.print( inData );
        pw.println();


----------



## Tim S. (30. Apr 2009)

Das ist doch mal was, woran ich mich weiter entlang hangeln kann. :applaus:
Vielen, vielen dank für die schnelle Antwort ...

Falls ich es nicht hinkriegen sollte, melde ich mich wieder. 

*Wird sich jetzt in Arbeit stürzen*


----------



## SlaterB (30. Apr 2009)

da fällt mir auch noch auf:
 Socket s = ss.accept();
findet nur einmal statt,
während der Client ständig neue Sockets eröffnet (einer reicht bestimmt), wartet der Server auf Nachrichten vom ersten Socket


----------

