tutorials.de Buch-Aktion 02/2012
Like Tree1Danke
  • 1 Beitrag von zerix
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
1059
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    ElJarno ElJarno ist offline Mitglied Silber
    Registriert seit
    May 2010
    Beiträge
    88
    Hi Leute,
    folgender kleiner Chatclient, dabei liegt mein Anliegen bzw. meine Frage hauptsächlich auf die Thread-Klasse "EingehendReader" welcher für die Püfung von eingehenden Nachrichten eine Schleife durchläuft:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    
    package ClientServerTestProgramm;
     
    public class EinfacherChatClient {
        JTextArea eingehend;
        JTextField ausgehend;
        BufferedReader reader;
        PrintWriter writer;
        Socket sock;
        String message;
     
        public static void main(String[] args) {
            EinfacherChatClient client = new EinfacherChatClient();
            client.los();
        }
     
        public void los() {
                    GUI-Zeugs...
     
            netzwerkEinrichten();
            Thread readerThread = new Thread(new IncomingReader());
            readerThread.start();
     
                    GUI-Zeugs...
        } // close go
     
        private void netzwerkEinrichten() {
            try {
                sock = new Socket("127.0.0.1", 5000);
                InputStreamReader streamReader = new InputStreamReader(sock
                        .getInputStream());
                reader = new BufferedReader(streamReader);
                writer = new PrintWriter(sock.getOutputStream());
                System.out.println("Netzwerkverbindung steht");
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
     
        public class SendenButtonListener implements ActionListener {
            public void actionPerformed(ActionEvent ev) {
                try {
                    writer.println(ausgehend.getText());
                    writer.flush();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                ausgehend.setText("");
                ausgehend.requestFocus();
            }
        }
     
        public class EingehendReader implements Runnable {
            public void run() {
                try {
                    while ((message = reader.readLine()) != null) {
                        System.out.println("gelesen: " + message);
                        eingehend.append(message + "\n");
                    }
                    System.out
                            .println("Beende Thread für eingehende Nachrichten im Client...");
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }

    Nun zu meiner eigentlichen Frage. Und zwar, wird die Schleife in dem Thread welcher eingehende Nachrichten abpfängt nicht sofort beendet, da ja readline() null zurückwirft und damit wird der Thread ebenfalls nicht sofort beendet?
    Also das Programm funktioniert, nur ist mir nicht klar wieso die Schleife bestehen bleibt obwohl nichts gesendet wird.

    Gruß Jan
     

  2. #2
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.329
    Hallo,

    readLine gibt erst null zurück, wenn der Stream beendet ist. Es wird an dieser Stelle gewartet, bis entweder der Stream beendet ist oder Daten geschickt werden.

    Gleiches siehst du, wenn du von der Windows-Konsole einliest, dort wird ja auch gewartet, bis du etwas eingegeben hast und Enter gedrückt hast.

    Deshalb wird dieser Thread nicht beendet.

    Gruß

    Sascha
    ElJarno bedankt sich. 
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  3. #3
    ElJarno ElJarno ist offline Mitglied Silber
    Registriert seit
    May 2010
    Beiträge
    88
    Super.
    Danke für die rasche Antwort.

    Nun noch was. Wie würde man das Programm denn nun Sauber beenden? Über sock.close(); Dann gibts natürlich Exceptions, Egal?
     

  4. #4
    Elmu Tutorials.de Gastzugang
    Fürs ,,saubere'' Beenden zuerst die Threads beenden, Streams schließen und dann die Sockets(Client/Server?
     

  5. #5
    ElJarno ElJarno ist offline Mitglied Silber
    Registriert seit
    May 2010
    Beiträge
    88
    Ja Problem ist nur dass sich der Thread irgendwie nicht wirklich schließen lässt bzw. die Streams. Wird beim Schließen der Streams der Socket nicht automatisch geschlossen?
    Beispielcode wäre nett.
     

  6. #6
    Elmu Tutorials.de Gastzugang
    Kommt auf deinen Code an.

    Einen Thread kannst du mit .close() anhalten bzw. schließen.

    .stop() zwingt den Thread anzuhalten.


    Das hier könntest du in deine eigene Threadklasse schreiben und damit close() überschreiben, was von der Klasse Thread kommt. Dann hast du alles drin.

    public void close() throws IOException
    { if (socket != null) socket.close();
    if (streamIn != null) streamIn.close();
    if (streamOut != null) streamOut.close();
    }

    Es hat ja jeder Thread seinen eigenen Stream.

    Im eigentlichen Server, welcher die Threads startet, könntest du dann folgenden Code benutzen

    try
    { toTerminate.close(); }
    catch(IOException ioe)
    { serverFenster.serverAnzeige.append("Fehler: " + ioe); }
    toTerminate.stop(); }

    Ich hab jetzt einfach aus meinem Stücke rauskopiert... sind also nicht unbedingt 1:1 übertragbar und lauffähig.
     

  7. #7
    Elmu Tutorials.de Gastzugang
    Ups, da ist nen Denkfehler drin mit close(). Es wird nicht geerbt usw.
     

  8. #8
    ElJarno ElJarno ist offline Mitglied Silber
    Registriert seit
    May 2010
    Beiträge
    88
    Zitat Zitat von Elmu Beitrag anzeigen
    Ups, da ist nen Denkfehler drin mit close(). Es wird nicht geerbt usw.
    worauf bezieht sich das?
     

  9. #9
    Elmu Tutorials.de Gastzugang
    Das es in der Klasse Thread kein close() gibt. Ich war irgendwie bei der Streams, gedanklich.

    Aufjedenfall kannst du ja eine derartige Funktion schreiben, welche dir alles noch offenen Streams des Threads schließt. Anschließend kannst du den Thread ruhig via stop() killen, ..
     

  10. #10
    Lastlord Lastlord ist offline Mitglied Silber
    Registriert seit
    Jun 2008
    Ort
    Hannover
    Beiträge
    82
    stop() ist ein dreckiger und gefährlicher Weg, den man NIEMALS gehen sollte und nicht umsonst als veraltet markiert wurde!
    http://download.oracle.com/javase/1....precation.html
    Ne Exception ist in jedem Fall immer besser! Schließlich ist ne Exception ne Ausnahme und kein Error oder sowas. Also keine Scheu beim Werfen und Fangen...
    Geändert von Lastlord (06.09.10 um 22:20 Uhr) Grund: Ergänzung um Link
     

Ähnliche Themen

  1. [MySQL] Verständisproblem IN / FIND_IN_SET
    Von Steusi im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 01.11.10, 15:07
  2. Antworten: 4
    Letzter Beitrag: 11.11.09, 08:37
  3. Kopf in Filmen an den kopf "heften" ?
    Von rudmann im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 3
    Letzter Beitrag: 30.08.08, 19:01
  4. SOAP WSDL PHP5 Verständisproblem
    Von bernhard123 im Forum PHP
    Antworten: 1
    Letzter Beitrag: 01.02.08, 19:05
  5. Remoting - Verständisproblem
    Von XChris im Forum .NET Web und Kommunikation
    Antworten: 2
    Letzter Beitrag: 10.08.06, 12:59