Chat Programm. Verständnisfrage while-Schleife

Status
Nicht offen für weitere Antworten.

Feliband

Mitglied
Hi,

ich habe hier einen Chatserver und einen Client aus dem Java HeadFirst Buch. Es funktioniert alles.

In der Methode IncomingReader verstehe ich nicht wieso die while-Schleife in Zeile 93 keinen Endlostext in der Konsole oder GUI ausgibt. message wird doch niemals null. Ich meine es müsste unendlich "read " auf der Konsole ausgegeben werden. Was verstehe ich da falsch?

Hier der Quelltext für den Client und den Server:

Code:
import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class SimpleChatClient {

    JTextArea incoming;
    JTextField outgoing;
    BufferedReader reader;
    PrintWriter writer;
    Socket sock;

    public static void main(String[] args) {
       SimpleChatClient client = new SimpleChatClient();
       client.go();
    }

   public void go() {

       // build gui

        JFrame frame = new JFrame("Simple Chat Client");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel mainPanel = new JPanel();
        
        incoming = new JTextArea(15,20);  // was 15,50
        incoming.setLineWrap(true);
        incoming.setWrapStyleWord(true);
        incoming.setEditable(false);
       
        JScrollPane qScroller = new JScrollPane(incoming);
        qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        

        outgoing = new JTextField(20);
        

        JButton sendButton = new JButton("Send");
        sendButton.addActionListener(new SendButtonListener());

        
        mainPanel.add(qScroller);
        mainPanel.add(outgoing);
        mainPanel.add(sendButton);
        
        setUpNetworking();
        Thread readerThread = new Thread(new IncomingReader());
        readerThread.start();
      
        frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
        frame.setSize(400,500);
        frame.setVisible(true);
                
   
     } // close go

   private void setUpNetworking() {  
        try {
           sock = new Socket("localhost", 5000);
           InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
           reader = new BufferedReader(streamReader);

           writer = new PrintWriter(sock.getOutputStream());
          
           System.out.println("networking established");
        } catch(IOException ex) {
           ex.printStackTrace();
        }
     } // close setUpNetworking   

   public class SendButtonListener implements ActionListener {
      public void actionPerformed(ActionEvent ev) {
          try {
             writer.println(outgoing.getText());
             writer.flush();
             
          } catch(Exception ex) {
             ex.printStackTrace();
          }
          outgoing.setText("");
          outgoing.requestFocus();
      }
    }  // close SendButtonListener inner class

  public class IncomingReader implements Runnable {
     public void run() {
           String message;             
           try {
             while ((message = reader.readLine()) != null) {
                System.out.println("read " + message);
                incoming.append(message + "\n");
    
              } // close while
           } catch(Exception ex) {ex.printStackTrace();}
       } // close run
   } // close inner class

Code:
import java.io.*;
import java.net.*;
import java.util.*;

public class VerySimpleChatServer {

    ArrayList<PrintWriter> clientOutputStreams;


    public class ClientHandler implements Runnable {

         BufferedReader reader;
       
         Socket sock;
   

         public ClientHandler(Socket clientSocket) {
           try {
             sock = clientSocket;
             InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
             reader = new BufferedReader(isReader);
              
           } catch(Exception ex) {ex.printStackTrace();}
          } // close constructor

        public void run() {
           String message;
             
           try {

             while ((message = reader.readLine()) != null) {
                
                System.out.println("read " + message);
                tellEveryone(message);
    
              } // close while
           } catch(Exception ex) {ex.printStackTrace();}
       } // close run
   } // close inner class
      



     public static void main (String[] args) {
         new VerySimpleChatServer().go();
    }

     public void go() {
      clientOutputStreams = new ArrayList<PrintWriter>();

       try {
       ServerSocket serverSock = new ServerSocket(5000);

       while(true) {
          Socket clientSocket = serverSock.accept();
          PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());         
          clientOutputStreams.add(writer);

       Thread t = new Thread(new ClientHandler(clientSocket));
       t.start();


       System.out.println("got a connection");
     }
       // now if I get here I have a connection
               
      }catch(Exception ex) {
         ex.printStackTrace();
      }
   }

   public void tellEveryone(String message) {
      Iterator it = clientOutputStreams.iterator();
      while(it.hasNext()) {
        try {
           PrintWriter writer = (PrintWriter) it.next();
           writer.println(message);
           writer.flush();
         } catch(Exception ex) {
              ex.printStackTrace();
         }
      
       } // end while
       
   } // close tellEveryone


}
[/code]
 
S

SlaterB

Gast
message = reader.readLine()
wird doch ständig neu gesetzt, nur wenn im reader was drin ist, kommt eine ordentliche message,
nach kurzer Zeit ist null erreicht, die Schleife bricht ab,
 

HoaX

Top Contributor
lies doch einfach die apidoc zu readLine? es blockiert den ablauf bis eine vollständige zeile verfügbar ist. und das != null sorgt dafür, dass wenn der stream zu ende ist abgebrochen wird.
 

Feliband

Mitglied
Danke für die schnellen Antworten.

Das verstehe ich ja gerade nicht, die while-Schleife wird nicht abgebrochen. Sie müsste doch abbrechen, nachdem ich meinen Text abgesendet habe, oder? Sie läuft aber weiter und und gibt jedesmal Text aus, wenn eine Nachricht abgesendet wurde, was ja auch richtig ist, da auf eingehende Nachrichten gewartet werden soll.
 
S

SlaterB

Gast
erst sagst du, du verstehst nicht, warum es keine Endlosschleife gibt und nun genau andersrum?..

> ie läuft aber weiter und und gibt jedesmal Text aus

generiert die Schleife sich zufällig ausgedachten Text oder wie ;)
WELCHER Text kommt da?

-------

oder meinst du, dass die Operation wartet statt abzubrechen?,
(sag doch mal deutlich was passiert und was du meinst...)
das ist normal, siehe Antwort Hoax
 

sparrow

Top Contributor
Ich finde diese Konstruktion für die while-Schleife auch sehr unleserlich.
Nach einer Weile in Java gewöhnt man sich aber dran.
Du könntest das ganze auch so schreiben:

Code:
while (true) { 
   
   message = reader.readLine();
   if (message == null) {
      break;
   } else {
      System.out.println("read " + message); 
      tellEveryone(message); 
   }

}


Diese Schleife prüft die Bedingung nicht am Anfang sondern in der Schleife selbst.
Sie blockiert so lange in Zeile 3 bis eine vollständige Zeile angekommen ist, oder aber die Verbindung abegabut wurde.
Wird die Verbindung abgebrochen ist der Rückgabewert von reader.readLine() null, die Schleife wird abgebrochen.
Ansonsten wird die Rückgabe von reader.readLine() ausgegeben.


Gruß
Sparrow
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Framework/ Muster für Chat-ähnliches Programm gesucht Netzwerkprogrammierung 2
P Probleme bei Chat programm Netzwerkprogrammierung 2
V probleme mit dem chat programm Netzwerkprogrammierung 4
G Chat Programm - was ist los? Netzwerkprogrammierung 9
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
L Chat Fenster Netzwerkprogrammierung 1
J Socket Ein Chat Server Tutorial Netzwerkprogrammierung 8
S Java Chat Server Netzwerkprogrammierung 8
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
P Chat in Java Netzwerkprogrammierung 3
C Java Chat Admin Kenzeichnung Netzwerkprogrammierung 14
D Chat Server/mehre Client Netzwerkprogrammierung 9
Androbin Socket Fehlerhafter Applet-Chat Netzwerkprogrammierung 12
C Microsoft Comic Chat Netzwerkprogrammierung 0
G Socket Socket verbindung für Chat System Netzwerkprogrammierung 3
O Chat (Server) sendet an verschieden Benutzer. Netzwerkprogrammierung 10
J Chat programmieren Netzwerkprogrammierung 12
L Chat Server programmieren Netzwerkprogrammierung 10
TheJavaKid Webcam-Chat im Applet (ChatRoulette Klon) Netzwerkprogrammierung 10
H Socket Java Chat - Verbindung zum Server fehlgeschlagen. Netzwerkprogrammierung 5
K Socket Chat-GUI eigenes Event nach Empfangen Netzwerkprogrammierung 2
K chat Netzwerkprogrammierung 13
F RMI einfacher Chat - Callbacks(?) funktionieren nicht Netzwerkprogrammierung 7
L Socket Chat funktioniert nicht Netzwerkprogrammierung 2
T Socket Java Chat Netzwerkprogrammierung 2
xDarkSunx Chat JFrame Netzwerkprogrammierung 3
xDarkSunx Hilfe Chat Login Netzwerkprogrammierung 7
E JAVA Chat Netzwerkprogrammierung 19
C Java Chat funktioniert nicht richtig Netzwerkprogrammierung 6
I Chat-Client empfängt nichts vom Server Netzwerkprogrammierung 3
A Socket UDP Chat Verbindungsproblem im WWW (Server sendet ins leere) Netzwerkprogrammierung 11
A Multi-User-Chat Netzwerkprogrammierung 2
M Socket Chat-Client-Problem Netzwerkprogrammierung 8
E Userliste für Chat Applet Netzwerkprogrammierung 4
L Socket Chat Server für mehrere Clients Netzwerkprogrammierung 7
AMStyles Client Server basierter Chat Netzwerkprogrammierung 7
M chat als applet umgeschrieben - unbekannter fehler :( Netzwerkprogrammierung 2
P Socket Chat selbst bauen + Multiusereditor Netzwerkprogrammierung 13
T Java Chat über UDP Netzwerkprogrammierung 7
Developer_X Habe fragen zur Chat Programmierung Netzwerkprogrammierung 4
P Java Multiuser Chat hohe Systemauslastung Netzwerkprogrammierung 24
D Hilfe ich komme bei meinem UDP chat Server nicht mehr weiter Netzwerkprogrammierung 9
B Die alte Leier: "Chat" Netzwerkprogrammierung 3
M chat funktioniert nicht (Connection refused: connect) Netzwerkprogrammierung 3
R Java-Chat-Applet funktioniert nur in Eclipse Netzwerkprogrammierung 3
S Client-Server Chat Problem nur im lokalen Netztwerk Netzwerkprogrammierung 23
DamienX Chat Socketserver/Client. wo ist das Problem? Netzwerkprogrammierung 2
J Client-Client-Chat ohne Serverbeteiligung Netzwerkprogrammierung 2
A Wichtig für einen Chat? Netzwerkprogrammierung 4
S Java Applet Chat Grundsatzfrage Netzwerkprogrammierung 6
R Java Chat über Inet connecten Netzwerkprogrammierung 3
C Voice Chat Netzwerkprogrammierung 3
G FAQ Chat geht nicht ? Netzwerkprogrammierung 4
T Schriftfarbe im Chat ändern Netzwerkprogrammierung 2
G ActionEvent klappt beim Chat nicht Netzwerkprogrammierung 5
J Kleines Problem mit Chat Server Netzwerkprogrammierung 2
T Chat-Client Netzwerkprogrammierung 12
G Chat zwischen applets: möglich? Netzwerkprogrammierung 2
T Chat mit mehreren Clients Netzwerkprogrammierung 3
C Chat , Streamproblem, PumpingException, Danke Netzwerkprogrammierung 2
S RMI Chat Problem, Client bekannt machen Netzwerkprogrammierung 2
K Lokaler Chat Netzwerkprogrammierung 5
S Chat aufs Internet ausweiten Netzwerkprogrammierung 5
J Router behindert Chat Netzwerkprogrammierung 9
S Knuddels Chat System: Bot / Nachrichten verschicken? Netzwerkprogrammierung 6
G Chat - was brauch ich Netzwerkprogrammierung 2
André B. Brauche Hilfe bei Chat Netzwerkprogrammierung 6
K Problem mit "Chat" Netzwerkprogrammierung 2
N Java-Chat (lauffähig) macht Probleme auf der Konsole Netzwerkprogrammierung 6
Paule Acces denied bei Chat Netzwerkprogrammierung 6
B Multi-chat Problem Netzwerkprogrammierung 3
N Java Chat-Problem Netzwerkprogrammierung 4
G Java Chat mit HTML Cleint Netzwerkprogrammierung 3
A server mit 2 Ports : Mit und ohne SSL Chat system Netzwerkprogrammierung 10
Z chat: wann http und wann sockets verwenden? Netzwerkprogrammierung 11
M Socket Verbindungen für einen Chat Netzwerkprogrammierung 10
R Mini-Chat löst BindException aus Netzwerkprogrammierung 7
F Multiclient Chat Netzwerkprogrammierung 12
K Chat: Nur 1 Verbindung zum Server möglich :( Netzwerkprogrammierung 6
K Chat: Verbindung kommt nicht zu stande Netzwerkprogrammierung 6
S JAV07P SGD client/server chat Netzwerkprogrammierung 4
C IRC CHAT auslesen -> Sockets/input und output Streams Netzwerkprogrammierung 9
S Einfacher Multiuser chat in java Netzwerkprogrammierung 18
M Erstelltes Programm über Internet Browser ausführen Netzwerkprogrammierung 26
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
G Programm unter anderer IP ausführen Netzwerkprogrammierung 6
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
A Classpath Tomcat, Start von Programm aus Tomcat Container Netzwerkprogrammierung 1
M Java-Programm aus dem Web laden Netzwerkprogrammierung 3
E Eingabe (auf Internetseite) durch ein Programm machen lassen Netzwerkprogrammierung 19
T UDP Pakete empfangen ohne Programm zu blockieren Netzwerkprogrammierung 3
S HTTP Servlet als Instanzen im Programm starten Netzwerkprogrammierung 3
M Paktete abfangen und zu eigenem Programm umleiten - wie? Netzwerkprogrammierung 5
C Programm per Hompage ansprechen Netzwerkprogrammierung 4
T Download Programm - Download endet vorzeitig (bricht ab) Netzwerkprogrammierung 11
K Programm als Webservice laufen lassen Netzwerkprogrammierung 5
G ObjectInputStream hängt ganzes Programm auf... Netzwerkprogrammierung 7
C Vom Server Programm auf Client starten Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben