Chatprogrammbeispiel aus Java von Kopf bis Fuß Verständisproblem?!

ElJarno

Mitglied
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:
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ß

Sascha
 
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?
 
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.
 
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.
 
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, ..
 

Neue Beiträge

Zurück