# Chatprogramm mit GUI



## iJava (3. Jun 2011)

Erstmal Hallo an alle !
Das ist mein erster Post in diesem Forum 

Nach stundenlangen googlen und Foren-abtasten hab ich mich dann doch dazu entschieden mich hier anzumelden. 

Habe folgendes Problem:
Ich möchte ein kleines Chat-Programm schreiben, also eine Client Server Anwendung mit GUI. Mit der Client-Server Architektur kenne ich mich relativ gut aus, doch die GUI in den Client einzubinden bereitet mir Schwierigkeiten. Jetzt hab ich mir mit einem GUI Editor mein Frame zusammengebastelt und der "Send"-Button soll nun jedes mal wenn er angeklickt wird den Text innerhalb des Textfields sich holen und über den Client an den Server senden (so habe ich mir das gedacht). 
Der Teil bei dem ich nicht mehr weiter weiß ist in den Klassen kommentiert 
Ich hoffe ihr könnt mir weiterhelfen und vielen vielen Dank schon mal im voraus!


```
import java.io.*;
import java.net.*;

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

  public Client(String host, int port, GUI g){
    this.host = host;
    this.port = port;
    this.g = g;
  }
  public void startClient(){
    try{
      client = new Socket(host, port);
      out = new BufferedWriter
      (new OutputStreamWriter(client.getOutputStream()));
      
      //hier müsste nun jedes mal wenn der Button geklickt wird
      //die Nachricht versendet werden mit out.write( ? );out.newLine();out.flush();
      
      out.close();
    } catch (IOException e) { System.err.println(e); }
    finally{
      try{
        if(client != null)
          client.close();
      }catch (IOException e) { System.err.println(e); }
    }
  }
}
```

meine GUI

```
public class GUI extends javax.swing.JFrame {

    public GUI() {
        initComponents();
    }
      //hier generierter Code...

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        String eing = jTextField2.getText();
       //nun dem Client den String übergeben, damit dieser versendet wird?? ...
    }                                        

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new GUI().setVisible(true);
            }
        });
    }
    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextField jTextField2;
}
```


----------



## eRaaaa (3. Jun 2011)

Ja du hast es eig. genau verkehrt herum gemacht in diesem Fall. Der Client bekommt keine Referenz zur GUI, die spielt für ihn keine Rolle. Aber die GUI muss genau wie du schon richtig kommentiert hast jetzt den Text weiterleiten. Du könntest noch ein Controller dazwischen packen, an den du jetzt die Nachricht leitest und er kennt dann den Client. Oder die übergibst den Client der GUI (eben genau andersherum)
Dann würd eich im Clinet noch eine Methode implementieren ala` sendMsg(String msg){ ...hier dann der out.write..}
Und in deiner actionPerformed rufst du dann eben sendMsg auf dem Client-Objekt auf (oder eben leitest es an den Controller weiter) mit dem eing String!


----------



## iJava (3. Jun 2011)

Vielen Dank schon mal für deine schnelle Antwort. Bin erstaunt darüber wie schnell das hier geht!
Hab das jetzt so umgesetzt wie eRaaaa gesagt hat aber krieg eine NullPointerException. Bin echt am Ende mit meinem Latein. Was ist falsch?? :bahnhof:


```
public class GUI extends javax.swing.JFrame {
    private Client c;

    public GUI(Client c) {
        initComponents();
        this.c = c;
    }
 
    //hier generierter Code...

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        String eing = jTextField2.getText();
        try {
            c.sende(eing);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                Client c = new Client("localhost",5000);
                c.startClient();
                new GUI(c).setVisible(true);
            }
        });
    }
    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextField jTextField2;
}
```


```
import java.io.*;
import java.net.*;

public class Client {
  private BufferedReader in;
  private BufferedWriter out;
  private Socket client;
  private String host;
  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()));

    } 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 s)throws IOException{
      out.write(s);
      out.newLine();
      out.flush();
  }
}
```


----------



## eRaaaa (3. Jun 2011)

Kann man jetzt so schlecht nachvollziehen, wie genau lautet denn die NPE? Zeilennummern und co. werden ja auch angegeben, worauf verweisen die etc.?


----------



## iJava (3. Jun 2011)

Seh´grad das ist eine Socket Exception.... schätze mal das liegt daran, dass ich die startClient Methode aufrufe und anschließend noch über meine sendMethode noch etwas versenden will, während der Socket schon zu ist aber wie soll ich das denn anders machen? 

Wer sich´s mal ansehen will


----------



## eRaaaa (3. Jun 2011)

Naja nimm z.B. mal das client.close() aus dem finally-Block


----------



## iJava (3. Jun 2011)

eraaaa du bist ein GOTT !
Es läuft.
Ohje stehe heut echt aufm Schlauch... 
Die Firma bedankt sich!


----------

