Client-Server Kommunikation über GUI

Roman90

Grünschnabel
Erstmal Hallo an alle !

Ich wollte eine kleine Client-Server Anwendung schrieben, in der Nachrichten (genauer gesagt 2 Koordinaten) über eine GUI (ein Textfeld für die x Koordinate, ein Textfeld für die y Koordinate und ein Button zum "abschicken") eingelesen werden und an den Server gesendet werden. Und zwar soll das Ganze in in einer Endlos-Schleife ablaufen - also jedes mal wenn der Benutzer mal Lust hat, kann er direkt die zwei Koordinaten an den Server senden.
Server seitig hab ich da keine Probleme mit (er liest einfach ständig in einem Thread die einkommenden Nachrichten...). Auch die GUI kann ich problemlos zusammenkleben, weiss allerdings nicht wie ich das in dem Client umsetzen soll (Methodenaufruf der Client Klasse durch die GUI?, Thread der auf GUI wartet?). Stehe grad voll auf der Leitung.
Wäre euch echt sehr verbunden wenn ihr mir weiterhelfen könntet.

hier der Client
Java:
import java.io.*;
import java.net.*;
import java.util.Scanner;

public class Client {
  private BufferedReader in;
  private BufferedWriter out;
  private Socket client;;
  private int port;
  

  public Client(String host, int port){
    this.host = host;
    this.port = port;
  }

  public void startClient(){
    try{
      client = new Socket(host, port);

      out = new BufferedWriter
      (new OutputStreamWriter(client.getOutputStream()));

      //hier endlosschleife mit Methodenaufruf sende(x,y) über GUI? o.O
      
      
      out.close();
    } catch (IOException e) { System.err.println(e); }
    finally{
      try{
        if(client != null)
          client.close();
      }catch (IOException e) { System.err.println(e); }
    }
  }
  
  public void sende(String x, String y)throws IOException{
      out.write(x);
      out.newLine();
      out.flush();
      out.write(y);
      out.newLine();
      out.flush();
  }

  public static void main(String[] args) {
    new Client("localhost", 5000).startClient();
  }
}
 
Ich verstehe nicht wieso du die Daten in einer Endlosschleife senden möchtest, du hast doch einen Button mit einem ActionEvent, mit dem du sagen kannst wann du speziell die Daten senden möchtest...

Falls es dir darum geht, dass ohne Endlosschleife deine Methode weiterlaufen würde, dann kann ich dich beruhigen. Nimm für deine GUI einfach z.B. einen JDialog, diesen kannst du Modal machen und deine Methode läuft erst weiter, wenn dieser wieder geschlossen wurde.

Im Endeffekt könnte dies etwa so aussehen:
Java:
import java.io.*;
import java.net.*;
import java.util.Scanner;
 
public class Client implements ActionListener{
  private BufferedReader in;
  private BufferedWriter out;
  private Socket client;
  private int port;
  
 
  public Client(String host, int port) {
    this.host = host;
    this.port = port;
  }
 
  public void startClient(){
    try{
      client = new Socket(host, port);
 
      out = new BufferedWriter
      (new OutputStreamWriter(client.getOutputStream()));
 
      JDialog clientGUI = new JDialog();
	//hier deinen Dialog konfigurieren inklusive clientGUI.setModal(true); & button.addActionListener(this);
      
      
      out.close();
    } catch (IOException e) { System.err.println(e); }
    finally{
      try{
        if(client != null)
          client.close();
      }catch (IOException e) { System.err.println(e); }
    }
  }
  
  public void sende(String x, String y)throws IOException{
      out.write(x);
      out.newLine();
      out.flush();
      out.write(y);
      out.newLine();
      out.flush();
  }

  public void actionPerformed(ActionEvent ae) {
	//hier Daten senden
  }
 
  public static void main(String[] args) {
    new Client("localhost", 5000).startClient();
  }
}
 
Vielen Dank schon mal für deine Antwort!
Hab es mir aber leider etwas anders vorgestellt: Die Koordinaten sollen, jedes mal und unabhängig von anderen Prozessen an den Server gesendet werden. Das kann man sich ein wenig so vorstellen, wie eine Chat-Anwendung bei der die Clients, unabhängig davon was sonst gerade so los ist, eine Nachricht in ein Textfield eintippen und mit einem Send-Button an den Server schicken können (so oft sie eben wollen) und der Server verarbeitet das dann. Also Endlosschleifen-mäßig - Ich hoffe ihr versteht, was ich meine.

Edit: Es soll quasi so sein: die GUI (eine extra Klasse) enthält einen Button, der sich die Inhalte der beiden Textfelder holt und dann eine Methode der Klasse Client anwendet, mit der die Inhalte an den Server verschickt werden (so meine Überlegung).
 
Zuletzt bearbeitet:
Dazu benötigst du keine Endlosschleife. Also gut, sagen wir du hast eine Klasse GUI, mit einem Button senden und zwei Textfeldern für x und y. Für den Button musst du dann einfach einen ActionListener definieren. Ich hoffe das sagt dir etwas. Weiterhin musst du im Konstruktor der Klasse GUI eine Referenz auf deinen Client übergeben. In actionPerformed vom ActionListener rufst du dann die Methode sende von deinem Client auf. Ich hoffe das hilft dir.
 
Ich würde sagen TO fehlen hier einige wichtige Grundlagen zum Thema EventHandling.
 
Zurück