Socket [Chatprogramm] Nachrichten vom Server anzeigen lassen

Zel2491

Aktives Mitglied
Hoi 😉

In meinem Chatprogramm lauscht meine Klasse ListenToServer ständig auf Nachrichten, die ich vom Server bekomme:

Java:
package network;

import gui.UserInterfaceClient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ListenToServer extends Thread {

	private BufferedReader inFromServer = null;
	private String msgFromServer = null;
	private Socket clientSocket = null;
	private UserInterfaceClient uic = new UserInterfaceClient(null, null);

	public ListenToServer(Socket clientSocket) {
		this.clientSocket = clientSocket;
		this.start();

	}

	public void run() {

		try {

			inFromServer = new BufferedReader(new InputStreamReader(
					clientSocket.getInputStream()));

			while (true) {
				msgFromServer = inFromServer.readLine();
				uic.setMessage(msgFromServer);
				System.out.println("FROM SERVER: " + msgFromServer);

			}

		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

[c]uic.setMessage(msgFromServer);[/c] bezieht sich auf meinen Setter
Java:
public void setMessage(String message) {
		this.message = message;
	}

Also sobald eine Nachricht vom Server kommt, sollte er meinen String message mit der neuen Nachricht überschreiben und dann:

Java:
public void run() {
		while (true) {
			if (message != null) {
				out.append(message);
				message = null;
			}
		}
	}

sollte er in meinem GUI mein JTextArea out mit der neuen Nachricht anzeigen.

Das macht er aber nicht... Ich kriege eine Nachricht vom Server, hab mir die mal einfach per System.out.println in der Konsole anzeigen lassen, allerdings wird sie nicht im TextArea angezeigt...

Weiß da jemand weiter?

So long,

Zel
 
zwar lässt es die run-Methode vemuten aber ich frag trotzdem: läuft das in einem eigenen Thread? wird dieser auch richtig mit start() gestartet? könnte mir vorstellen, dass durch die Dauerschleife dein EDT einfriert
 
[c]uic.setMessage(msgFromServer);[/c] bezieht sich auf meinen Setter
Java:
public void setMessage(String message) {
		this.message = message;
	}

Also sobald eine Nachricht vom Server kommt, sollte er meinen String message mit der neuen Nachricht überschreiben und dann:

Java:
public void run() {
		while (true) {
			if (message != null) {
				out.append(message);
				message = null;
			}
		}
	}

sollte er in meinem GUI mein JTextArea out mit der neuen Nachricht anzeigen.

Das Vorgehen ist merkwürdig. Warum fügst Du die Nachricht nicht direkt in die TextArea ein anstatt mit einem !!Dauer!!Thread auf das befüllen einer Variable zu warten.

Warum der Code nicht funktioniert ist schwer zu sagen. Mögliche Fehlerquellen:
- der "merkwürdige" Thread läuft garnicht
- Die Variable
Code:
uic
im Listenerthread referenziert "falsche" nicht GUI relevante uic Objekt
...
 
Ach, ich seh gerad, hab was wichtiges vergessen zu erwähnen...:

ich schreibe es nicht direkt in das TextArea, weil dieses sich in einer anderen Klasse befindet, nämlich in der Klasse, die zu meiner Instanz uic gehört. Daher dachte ich mir, dass das Verfahren mit dem setter und dem Überschreiben die einfachste Variante sei.



Den Thread starte ich am Ende meines Konstruktors:

Java:
new Thread(this).start();


Zu den möglichen Fehlerquellen:

das mit den falschen Referenzen des uic-Objektes könnte es glaube ich eher sein, als dass der Thread nicht funktioniert.

Wenn es denn am uic-Objekt liegt: wüsste jemand eine Möglichkeit, dieses zu umgehen?
Fakt bleibt halt, dass der "gehorchte" Text in das TextArea muss, welches sich nunmal in einer anderen Klasse befindet...^^
 
Ich denke Mal, dass es mit dem Thread ein Problem gibt und zwar dem lokalen Speicher und deiner Instanzvariable. Ich würde dir lieber zu einem eigenen Listener empfehlen, der, sofern eine neue Nachricht, ein Event feuert und dann darauf reagiert. Damit bleibt das Problem mit dem lokalen internen Speicher der Threads aus.
 
Wenn ich mir das nochmal überdenke, wäre sogar ein Listener schon zu viel! Ich würde dir zu empfehlen, dass du in deiner set-Methode einfach eine Überprüfung einbaust, um null-Werte, etc. rauszufiltern und dann einfach die Message in die TextArea einsetzt ohne Umweg über einen Thread, Listener, Instanzvariable etc.
 

Zurück
Oben