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 :oops:
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:

Crunch

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

SlaterB

Gast
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Server synchronisation Netzwerkprogrammierung 3
N Gedankenspiel Synchronisation zweier Datenbanktabellen übers Netz Netzwerkprogrammierung 4
T Synchronisation von Bewegungen Netzwerkprogrammierung 11
borobudur Synchronisation von Clients Netzwerkprogrammierung 10
A RMI synchronisation Netzwerkprogrammierung 5
A Synchronisation und RMI Netzwerkprogrammierung 8
W Wifi verbinden durch SharensPreferens Android Studio Netzwerkprogrammierung 0
JavaWolf165 Mini-Datenbank durch Link Netzwerkprogrammierung 6
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
E Eingabe (auf Internetseite) durch ein Programm machen lassen Netzwerkprogrammierung 19
S Bilder durch's Netzwerk usw ... Netzwerkprogrammierung 10
Dit_ UDP Verbindung durch Proxy Netzwerkprogrammierung 4
Ollek Download einer Datei durch SFTP mit Java Netzwerkprogrammierung 12
B Server-Programm wird durch "read" beendet Netzwerkprogrammierung 8
Kr0e Ggf. Performanceproblem durch Senden von vielen kleinen Buffern Netzwerkprogrammierung 17
S RMI RMI Aufrufe kommen nicht mehr durch Netzwerkprogrammierung 4
H String Array durch einen Stream schicken. Netzwerkprogrammierung 4
V Mehrere Streams durch einen Stream senden Netzwerkprogrammierung 14
T TCP mit und ohne Threads Netzwerkprogrammierung 1
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
D Exception Handling bei In/Outputsockets in eigenen Threads Netzwerkprogrammierung 1
C Frage zu Threads & Server Netzwerkprogrammierung 4
K Threads closen und Sockets schliessen Netzwerkprogrammierung 5
J Threads & Streams Netzwerkprogrammierung 9
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S HTTP ServerSockets und Threads Netzwerkprogrammierung 5
B Sockets, Threads & Plugins Netzwerkprogrammierung 7
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
R Threads mit einem WebService Netzwerkprogrammierung 4
M Verständnisfrage zu RMI und Threads Netzwerkprogrammierung 2
L einfacher server ohne threads Netzwerkprogrammierung 4
A Threads auflisten und nacheinander ansprechen Netzwerkprogrammierung 6
J Probleme mit Threads (Client terminiert) Netzwerkprogrammierung 4
P Threads einbinden Netzwerkprogrammierung 11
P RMI Callback (mit Threads?) Netzwerkprogrammierung 3
T RMI Threads und Synchronized Netzwerkprogrammierung 13
A Datenverteilung: Mehrere Threads verwenden? Netzwerkprogrammierung 4
S Threads beim Server koordinieren Netzwerkprogrammierung 5
L ClientServer mit 2 Threads Netzwerkprogrammierung 5
N Threads und Socketprogrammierung Netzwerkprogrammierung 4
G 1 Socket 2 Threads problem Netzwerkprogrammierung 13
K Problem mit Threads Netzwerkprogrammierung 3
S Threads bei Web Service sinnvoll oder Alternative? Netzwerkprogrammierung 2
K Hintergrund - Threads Netzwerkprogrammierung 3
G Socket Programmierung - Max. Threads Netzwerkprogrammierung 5
C NetScanner arbeitet trotz Threads langsam Netzwerkprogrammierung 6
L UDP-Server mit Threads Netzwerkprogrammierung 8
K Windows 10 Threads gleichzeitig Netzwerkprogrammierung 18
C Join von Threads bei I/O-Operation Netzwerkprogrammierung 6
F Threads synchronisieren mit Pipes Netzwerkprogrammierung 3
G benötige Beispiel für parallel ablaufende Threads Netzwerkprogrammierung 3
F Problem mit Threads und Sockets Netzwerkprogrammierung 3
TRunKX Threads beenden sich selber? Netzwerkprogrammierung 6
T Kleiner Chatserver: Threads oder Multiplex? Netzwerkprogrammierung 18

Ähnliche Java Themen

Neue Themen


Oben