I/O - Synchronisation durch Threads in einem ChatClient

Crunch

Mitglied
Hallo zusammen,
bei meinem Chat Programm habe ich das Problem, dass der Benutzer des Clients über die Konsole Nachrichten verschicken soll, gleichzeitig aber natürlich auch ein BufferedReader auf Nachrichten vom Server warten soll.
Mein Grundgedanke war nun folgender:
Ein Thread wartet in einer Endlosschleife nur auf Eingaben des Client-Benutzers, ein anderer Thread wartet auf eingehende Nachrichten des Servers und unterbricht im Falle einer Nachricht den ersten Thread. Bei der Umsetzung haperts allerdings noch 😳
Da die Methode interrupt() so weit ich weiß, ja keine blockierenden Input/Output - Methoden abbricht, musste eine andere Lösung her.
Deshalb wechseln sich die Thread in meiner momentanen Lösung nur ab, ohne dass der eine den anderen unterbricht. Es funktioniert zwar, aber zufrieden bin ich nicht wirklich.

Hier der relevante Quellcode:

Klasse Client:

Java:
public class Client extends Thread {

    BufferedReader in;
    PrintWriter out;
    Socket socket;

    public Client(String host, int port) {
        try {
            socket = new Socket(host, port);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream());

        } catch (UnknownHostException ex) {
        } catch (IOException ex) {
        }

    }

    public void run() {
        Scanner sc = new Scanner(System.in);
        while (true) {
            
                String message = sc.nextLine();
                System.out.println(message);
        }
    }

    public static void main(String[] args) {
        Client c = new Client("127.0.0.1", 7575);
        MessageListener ml = new MessageListener(c.in);
        c.start();

    }
}

Klasse MessageListener:
Java:
class MessageListener extends Thread {

    BufferedReader in = null;

    public MessageListener(BufferedReader in) {
        this.in = in;
        this.start();
    }

    @Override
    public void run() {
        while (true) {
            try {
                if (in.ready()) {
                    String message = in.readLine();
                    System.out.println(message);
                }
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {
                }

            } catch (IOException ex) {
            }
        }
    }
}

Viele Grüße
Florian

PS: Mir ist bewusst, dass die Nachrichten momentan nur an die Konsole geschickt werden und nicht an den Server, dient allerdings nur zu Testzwecken.

Edit: In der Client-Klasse hatte sich durch schlampiges Kopieren ein Fehler im Konstruktor eingeschlichen, ist jetzt behoben, sorry dafür.
 
Zuletzt bearbeitet:
Hi,
im Prinzip funktioniert es ja so (auch wenn ich das sleep() in der Klasse MessageListener auskommentiere, wie ich vorhin bemerkt habe). Mich hätte nur einfach mal interessiert ob es da noch eine bessere Lösung gibt, BufferedReader und PrintWriter zu steuern, oder ob das so schon okay ist?

Gruß
 
hatte bisher noch gar nicht gelesen worum es geht,

so, also das Lesen auf System.in oder den Netzwerkreader kannst du wirklich nicht direkt unterbrechen, letzteren höchstens mit Timeout verstehen, aber auch dann dauert es einige Sekunden,
allerdings musst du da auch nichts unterbrechen, sollen die doch zunächst mal lesen,

wenn die dann etwas gelesen haben und irgendeine Aktion starten wollen (von Eingabe gelesenen String versenden <-> vom Netzwerk gelesenen String ausgeben),
dann kannst du die Threads beeinflussen, sie Synchronisierung usw. abarbeiten lassen,
bisher ist dazu anscheinend quasi nichts vorhanden, auch nichts mit Interrupt,

da sich die Threads nicht in die Quere kommen ist das auch gar nicht so sehr nötig, richtig,
spannender wärs wenn es z.B. ein gemeinsames Log/ eine GUI gäbe, in der jede Aktion von Beginn bis Ende ohne Unterbrechung von anderen aufgeführt werden soll
 

Zurück
Oben