Threads mit Client/Server und GUI (laufend bis button-click)

Yonnig

Mitglied
Guten Tag zusammen!

Ich beiße mir gerade irgendwie die Zähne an einer Aufgabe aus... Irgendwie will nicht in meinen Kopf, wie das funktioniert.
Ich soll eine App schreiben, welche gleichzeitig einen Server Socket für eingehende Clients bereitstellt sowie einen eigenen Socket, um sich mit einem anderen Server zu verbinden.
Dazu habe ich eine sporadische GUI gebaut und mit einem "disconnect"-Button versehen. Mein Ziel wäre es, dass sobald man auf diesen Button klickt, die Verbindungen zu den anderen Parteien aufgelöst wird:
-> Bei der anderen Client-Partei soll diese quasi mit beenden "mitzerstört" werden.

Aber das ist noch nicht mal das eigentliche Problem. Es scheitert momentan schon daran, dass ich es einfach nicht ganz verstehe, wie ich es schaffe, dass beim Starten der App ein Thread anspringt und folgende Dinge erledigt:
1. Anmelden beim anderen Server über ein Text-Protokoll
2. Zeichnen der GUI für die App
3. Der Thread in eine Endlosschleife geht und die vom User in der GUI getätigten Operationen erledigt (das ist für mich noch am unverständlichsten wie das gehen soll)
4. Beim disconnect-Buttonklick wie oben beschrieben Thread auflösen und abmelden.

Ich habe heute den ganzen Tag versucht zu verstehen, wie ich das hinbekomme... Bin irgendwie zu blöd gerade.

Zudem verstehe ich nicht ganz, wieso folgende Zeilen dazu führen, dass sich die App aufhängt...

Java:
else if(ae.getSource() == harbourInfo) {
                try(OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream());
                        PrintWriter pw = new PrintWriter(osw, true);
                        InputStreamReader isr = new InputStreamReader(socket.getInputStream());
                        BufferedReader br = new BufferedReader(isr);){
                    String msg = "getinfo:harbour";
                    pw.write(msg + "\r\n");
                    pw.flush();
                    String response = "";
                    String setInfoText = "";
                    while((response = br.readLine()) != null) {
                        System.out.println(response);
                        setInfoText = new String(setInfoText + response + "\n");
                    }
                    buttonInfos.setText(setInfoText);
                    } catch (IOException e) {
                      System.err.println(e.toString());
                    }

Dabei handelt es sich um durch einen Buttonklick angefordertes ActionEvent. Dabei sollen Daten vom Server angefordert werden.
In die Kommandozeile werden diese noch geschrieben, aber das Programm hängt sich dann auf.
Außerdem scheinen die Zeilen in der Kommandozeile auch "Macken" zu haben... immer die ersten Buchstaben sind nicht richtig.

Liebe Grüße
Yonnig
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Beim Programmstart existiert bereits ein Thread, der main-Thread. Für das UI wird vom Framework ebenfalls ein Thread gestartet (UI-Thread aka Event-Dispatch-Thread in Swing). Wenn vom Framework eine Methode aufgerufen wird, z. B. als Folge eines Button-Klicks, dann läuft diese Methode im UI-Thread.

Dein Client soll nun unabhängig vom UI laufen. In Deinem Button-Listener hat der Socket also schon mal gar nichts verloren. Vielmehr muss dein UI mit dem Client kommunizieren.

Das Senden wird vom UI ausgelöst, insofern genügt es, im Button-Listener das Senden zu initiieren. Etwas schwieriger wird es beim Empfangen. Der Zeitpunkt des Empfangs ist nicht alleine vom UI oder dem Programm abhängig, sondern stellt ein Ereignis von außen dar. Wenn der Server etwas sendet, wird es empfangen. Das UI muss dann über den Empfang informiert werden.

Der Empfänger-Thread liest also blockierend vom InputStream und sobald er etwas gelesen hat, informiert er einen Beobachter (s. Callback bzw. Observer-Pattern). Zusätzlich kann auch ein Puffer helfen, aus dem das UI dann letztlich liest. Beim Senden könnte man synchron arbeiten (wenn man in Kauf nimmt, dass das UI für die kurze Zeit blockiert), alternativ kann ein zusätzlicher Sender-Thread helfen, das UI nicht zu blockieren. Das UI könte z. B. in eine BlockingQueue schreiben, während der Sender-Thread die Daten daraus (blockierend) liest und dann sendet.
 
M

Mart

Gast
mit was für einem Framework hast du es geschrieben ?

wenn du es mit javafx geschrieben hast wird jeder Versuch einen Thread zu öffnen in eine Zufalls basierten absturz führen
deswegen gibts da Task und Service ... das sind ansich threads die aber innerhalb von javafx funktionieren
 

Yonnig

Mitglied
Beim Programmstart existiert bereits ein Thread, der main-Thread. Für das UI wird vom Framework ebenfalls ein Thread gestartet (UI-Thread aka Event-Dispatch-Thread in Swing). Wenn vom Framework eine Methode aufgerufen wird, z. B. als Folge eines Button-Klicks, dann läuft diese Methode im UI-Thread.

Dein Client soll nun unabhängig vom UI laufen. In Deinem Button-Listener hat der Socket also schon mal gar nichts verloren. Vielmehr muss dein UI mit dem Client kommunizieren.

Das Senden wird vom UI ausgelöst, insofern genügt es, im Button-Listener das Senden zu initiieren. Etwas schwieriger wird es beim Empfangen. Der Zeitpunkt des Empfangs ist nicht alleine vom UI oder dem Programm abhängig, sondern stellt ein Ereignis von außen dar. Wenn der Server etwas sendet, wird es empfangen. Das UI muss dann über den Empfang informiert werden.

Der Empfänger-Thread liest also blockierend vom InputStream und sobald er etwas gelesen hat, informiert er einen Beobachter (s. Callback bzw. Observer-Pattern). Zusätzlich kann auch ein Puffer helfen, aus dem das UI dann letztlich liest. Beim Senden könnte man synchron arbeiten (wenn man in Kauf nimmt, dass das UI für die kurze Zeit blockiert), alternativ kann ein zusätzlicher Sender-Thread helfen, das UI nicht zu blockieren. Das UI könte z. B. in eine BlockingQueue schreiben, während der Sender-Thread die Daten daraus (blockierend) liest und dann sendet.
Danke für die ausführliche Beschreibung. Ich muss mich nochmal näher mit alldem beschäftigen... Eventuell versuche ich erstmal alles ohne UI umzusetzen und schaue dann, wie ich es mit UI mache.

mit was für einem Framework hast du es geschrieben ?
ich habe das UI mit Swing geschrieben.
 

Yonnig

Mitglied
Hallo nochmal,

vielleicht passt das jetzt nicht mehr so ganz hier rein, aber ich hätte noch eine Frage zu den Input/Output Streams.
Wenn ich eine Klasse habe, und diese sich mit 2 Servern verbinden können soll, muss ich dann für jeden Socket quasi
einen kompletten Satz von reader/writern erstellen?

also z.B. für Server connection 1:
zum Lesen:
1x InputStreamReader
1x BufferedReader
zum Schreiben:
1x OutputStreamWriter
1x PrintWriter

also z.B. so:
Java:
try(InputStreamReader isr = new InputStreamReader(socket1.getInputStream());
                    BufferedReader br = new BufferedReader(isr);
                    OutputStreamWriter osw = new OutputStreamWriter(socket1.getOutputStream());
                    PrintWriter pw = new PrintWriter(osw, true);) {

und das ganze dann nochmal für die andere Verbindung oder wie löst man das geschickter?

Gruß
Yonnig
 

mihe7

Top Contributor
muss ich dann für jeden Socket quasi
einen kompletten Satz von reader/writern erstellen?
Jein. Der Socket liefert einen InputStream zum Lesen und einen OutputStream zum Schreiben. Wenn Dir die Streams nicht gefallen und Du lieber einen Reader bzw. Writer verwenden willst, dann musst Du natürlich entsprechende Objekte erzeugen.

Du kannst das auch schachteln, wird aber dann leicht unübersichtlich:
Java:
try(BufferedReader rd = new BufferedReader(new InputStreamReader(socket1.getInputStream()));
         PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket1.getOutputStream()), true)) {
}
Natürlich kannst Du das in Methoden auslagern und die grundsätzliche Frage wäre auch, ob Du die Streams tatsächlich ständig neu aufbauen willst. Das Schließen der Streams schließt auch den Socket. (Verbindung).
 

Yonnig

Mitglied
Man könnte dann ja die Streams erzeugen und innerhalb eines Threads in Dauerschleife Ein/Ausgaben verarbeiten und mit Beendigung des Threads auch die Streams dann schließen, korrekt? Wie genau das funktioniert weiß ich zwar noch nicht aber so würde ich das denke ich versuchen umzusetzen...

Also ich starte das Programm, verbinde mich mit den Servern, baue Streams auf, lasse auf Dauerschleife laufen und wenn der Thread interrupted wird Streams schließen und fertig?

Edit: Für jede Verbindung (jeden Socket) einen eigene Thread natürlich.
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Ja, wobei sich das blockierende Lesen nicht mit einem Thread.interrupt() unterbrechen lässt, wenn ich es richtig im Kopf habe. Du musst dann einfach den Stream schließen.

Dürfte in etwa so aussehen:

Java:
class ReaderThread implements Runnable {
    private final BufferedReader input;

    public ReaderThread(BufferedReader input) {
        this.input = input;
    }

    public void close() {
        try {
            input.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    @Override
    public void run() {
        String line;
        try {
            while ((line = input.readLine()) != null) {
                received(line);
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    private void received(String line) {
        // mach was mit line, z. B. irgendwelche Beobachter informieren
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Probleme mit Threads (Client terminiert) Netzwerkprogrammierung 4
T TCP mit und ohne Threads Netzwerkprogrammierung 1
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
C I/O - Synchronisation durch Threads in einem ChatClient 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
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
B Axis2 Webservice mit Client Zertifikat Authentifizierung Netzwerkprogrammierung 3
T Jetty mit Client-Zertifikat nur bei spezifischer URL Netzwerkprogrammierung 1
J Einlesen von Servernachrichten von TCP-Client Netzwerkprogrammierung 17
J Client-Server und SOAP Netzwerkprogrammierung 23
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
T Client zu Client Kommunikation Netzwerkprogrammierung 2
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
ruutaiokwu ständig "sender address rejected: improper use of smtp" bei smtp-client Netzwerkprogrammierung 4
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
A Chatserver/-client - Code stoppt bei readUTF() Netzwerkprogrammierung 7
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
L Zugriffprobleme Client - Webservice AspenTechnology Netzwerkprogrammierung 0
A Client Client Übertragung Netzwerkprogrammierung 12
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
K Socket Netty Client wirft Fehler! Netzwerkprogrammierung 3
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
U Client Soap Verbindung wieder schließen Netzwerkprogrammierung 0
U Socket Client mit hash authentifizieren Netzwerkprogrammierung 3
F HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat Netzwerkprogrammierung 2
P Server als Client nutzen Netzwerkprogrammierung 8
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
J Client - Serversocket Netzwerkprogrammierung 1
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
N Fragen zu Sockets Client Netzwerkprogrammierung 3
F Extasys TCp Client extends Funktion Netzwerkprogrammierung 0
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
O Client zwischen XML und JSON auswählen lassen Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
A Socket Wie ein einfacher Multithreads Service mit Telnet als Client mit Observable/Observer gelöst.... Netzwerkprogrammierung 0
K C# Server - Android Client Netzwerkprogrammierung 0
T Application Client NullPointerExc Netzwerkprogrammierung 7
V TCP Client funktioniert auf Emulator aber nicht auf Smartphone Netzwerkprogrammierung 5
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
H HTTP REST Jersey - PUT-Beispiel von Client senden Netzwerkprogrammierung 0
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
P HTTP Server / Client Netzwerkprogrammierung 1

Ähnliche Java Themen

Neue Themen


Oben