1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
9
9
ZUGRIFFE
1059
1059
EMPFEHLEN
-
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
-
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ß
SaschaEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
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?
-
17.08.10 10:01 #4Elmu Tutorials.de Gastzugang
Fürs ,,saubere'' Beenden zuerst die Threads beenden, Streams schließen und dann die Sockets(Client/Server?
-
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.
-
17.08.10 12:47 #6Elmu 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.
-
17.08.10 12:53 #7Elmu Tutorials.de Gastzugang
Ups, da ist nen Denkfehler drin mit close(). Es wird nicht geerbt usw.
-
-
17.08.10 15:00 #9Elmu 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, ..
-
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
-
[MySQL] Verständisproblem IN / FIND_IN_SET
Von Steusi im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 01.11.10, 15:07 -
Aus Eclipse Java Quellcode mit Kopf- und Fußzeile drucken
Von manolo im Forum JavaAntworten: 4Letzter Beitrag: 11.11.09, 08:37 -
Kopf in Filmen an den kopf "heften" ?
Von rudmann im Forum Videoschnitt, Videotechnik & -produktionAntworten: 3Letzter Beitrag: 30.08.08, 19:01 -
SOAP WSDL PHP5 Verständisproblem
Von bernhard123 im Forum PHPAntworten: 1Letzter Beitrag: 01.02.08, 19:05 -
Remoting - Verständisproblem
Von XChris im Forum .NET Web und KommunikationAntworten: 2Letzter Beitrag: 10.08.06, 12:59





Zitieren


Login




