# Befehle über ein GUI an Server senden



## cay (6. Jul 2010)

Hallo zusammen,

Bin seit mehreren Stunden daran ein kleines GUI zu Programmieren welches 3 Button haben sollte ( "Setzten", "Löschen", "Zustand"). Über diese 3 Button will ich befehle an einen Server senden. Dazu habe ich mal ein Testprogramm geschrieben, welches einen Port auf dem Server blinken lässt. Jedoch weiss ich nicht genau wie ich diese Befehle via GUI über die Button senden soll, sprich wie überhaupt den Zustand über den Input stream wieder zurückgelesen werden kann. Mit dem Befehl out.writeBytes ("port 2 get\n"); sendet mir eigentlich den Server den Zustand zurück.

Kann mir jemand helfen beim erstellen eines einfachen, richtig (Programmierstyl) funktionierendes Java GUI Programm? Welches einfach 3 Button hat und ein Textfeld wo der Zustand des Port angezeigt wird. 

- Drückt man "Setzen" sollte über das GUI den Befehl "port 2 setzten\n" gesendet werden.
- Drückt man "Löschen" sollte über das GUI den Befehl "port 2 löschen\n" gesendet werden.
- Drückt man "Zustand" sollte über das GUI den Befehl "port 2 get\n" gesendet werden und bekommt als antwort "0" oder "1+ zurück.


Herzlichen Dank jetzt schon im voraus.

Gruss marcel




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

class Server
{
    public static void main (String[] args)
    {
            try
            {
                System.out.print("waiting ... ");
                Socket server = new Socket("192.168.0.1", 23);
                DataOutputStream out = new DataOutputStream(server.getOutputStream());
                System.out.println("connected!");

                    
                 for(;;)
                 {
                    out.writeBytes ("port 2 setzten\n");
                    out.flush();
                    System.out.println ("gesetzt"); 
                    Thread.sleep (3000);
                    
                    out.writeBytes ("port 2 löschen\n");
                    out.flush();
                    System.out.println ("0");
                    Thread.sleep (3000);
                }
                

            }
            catch (Exception e)
            {
                System.out.println (e);
            }
        
    }
}
```


----------



## Gast2 (6. Jul 2010)

Also für die GUI:
JFrame, JButton, ActionListener
Im ActionListener wirst du dann das Kommando absetzen und (wenn du sagst dass der Server dir ne Antwort schickt) im nächsten Schritt auf dem InputStream lesen.

Aber ich würde mich erstmal an die GUI machen, d.h. wenn man auf nen Button klicken zeigt er z.b. irgendwas auf der Konsole an. Wenn das dann funktioniert kannste dich an die Kommunikation machen.


Zum Thema Programmierstil: 
	
	
	
	





```
catch (Exception e)
```
 <-- das sollte man in der Regel nicht machen


----------



## VfL_Freak (6. Jul 2010)

Moin,



EikeB hat gesagt.:


> Zum Thema Programmierstil:
> 
> ```
> catch (Exception e)
> ...



Ach, und warum nicht ???:L

Allerdings würde ich statt einem einfachen "System.out.println (e);" die Ausgabe mit 

```
e.printStackTrace();
```
bevorzugen, da hier deutlich mehr Infos enthalten sind !!

*Zum geposteten Code:*
bist Du sicher, dass sich das so übersetzen lässt ???:L

Wo kommt Dein Thread denn her ?
Schau mal hier:
Thread (Java Platform SE 6)

Sodann solltest Du Dir überlegen, wie und wann soll Deine Endlos-Scheife beendet werden soll !!

Gruß
Klaus


----------



## cay (6. Jul 2010)

Danke mal für die ersten Input's. Ja weiss ist nicht so optimal die endlosschlaufe ( for( ; ; ){...} ). Wie muss ich den die Klasse Server schreiben damit ich z.b von einer GUI Klasse über den ActionListerner einen Befehl versenden kann?


----------



## cay (6. Jul 2010)

Hier wäre also die GUI Klasse ..... Wie würde ich jetzt die Befehl nun an den Server senden? Hoffe es kann mir jemand weiterhelfen.


```
/****************************************************************/
/*                      GUI	                            */
/*                                                              */
/****************************************************************/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
 * Summary description for GUI
 *
 */
public class GUI extends JFrame
{
	// Variables declaration
	private JTextPane jTextPane1;
	private JButton jButton1;
	private JButton jButton2;
	private JButton jButton3;
	private JPanel contentPane;
	// End of variables declaration


	public GUI()
	{
		super();
		initializeComponent();
		//
		// TODO: Add any constructor code after initializeComponent call
		//

		this.setVisible(true);
	}

	/**
	 * This method is called from within the constructor to initialize the form.
	 * WARNING: Do NOT modify this code. The content of this method is always regenerated
	 * by the Windows Form Designer. Otherwise, retrieving design might not work properly.
	 * Tip: If you must revise this method, please backup this GUI file for JFrameBuilder
	 * to retrieve your design properly in future, before revising this method.
	 */
	private void initializeComponent()
	{
		jTextPane1 = new JTextPane();
		jButton1 = new JButton();
		jButton2 = new JButton();
		jButton3 = new JButton();
		contentPane = (JPanel)this.getContentPane();

		//
		// jTextPane1
		//
		jTextPane1.setText("Info");
		//
		// jButton1
		//
		jButton1.setText("set");
		jButton1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				jButton1_actionPerformed(e);
			}

		});
		//
		// jButton2
		//
		jButton2.setText("clr");
		jButton2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				jButton2_actionPerformed(e);
			}

		});
		//
		// jButton3
		//
		jButton3.setText("get");
		jButton3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				jButton3_actionPerformed(e);
			}

		});
		//
		// contentPane
		//
		contentPane.setLayout(null);
		addComponent(contentPane, jTextPane1, 9,103,351,138);
		addComponent(contentPane, jButton1, 11,10,83,28);
		addComponent(contentPane, jButton2, 12,40,83,28);
		addComponent(contentPane, jButton3, 11,72,83,28);
		//
		// GUI
		//
		this.setTitle("GUI - extends JFrame");
		this.setLocation(new Point(0, 0));
		this.setSize(new Dimension(390, 300));
	}

	/** Add Component Without a Layout Manager (Absolute Positioning) */
	private void addComponent(Container container,Component c,int x,int y,int width,int height)
	{
		c.setBounds(x,y,width,height);
		container.add(c);
	}

	//
	// TODO: Add any appropriate code in the following Event Handling Methods
	//
	private void jButton1_actionPerformed(ActionEvent e)
	{
		jTextPane1.setText("Setzten.");
		// TODO: Add any handling code here

	}

	private void jButton2_actionPerformed(ActionEvent e)
	{
		jTextPane1.setText("Löschen.");
		// TODO: Add any handling code here

	}

	private void jButton3_actionPerformed(ActionEvent e)
	{
		jTextPane1.setText("Get Wert.");
		// TODO: Add any handling code here

	}

	//
	// TODO: Add any method code to meet your needs in the following area
	//






























 

//============================= Testing ================================//
//=                                                                    =//
//= The following main method is just for testing this class you built.=//
//= After testing,you may simply delete it.                            =//
//======================================================================//
	public static void main(String[] args)
	{
		JFrame.setDefaultLookAndFeelDecorated(true);
		JDialog.setDefaultLookAndFeelDecorated(true);
		try
		{
			UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
		}
		catch (Exception ex)
		{
			System.out.println("Failed loading L&F: ");
			System.out.println(ex);
		}
		new GUI();
	}
//= End of Testing =


}
```


----------



## Gast2 (6. Jul 2010)

Entweder du erstellst den Socket direkt in der klasse GUI und verwendest den dort direkt.

Oder du lässt die ganze Kommunikation in der Klasse Server und bietest dort ne Methode zum Senden an.


----------



## cay (6. Jul 2010)

Wie würde man den die Methode in der Klasse Server realisieren? Weil momentan ist die Serverklasse eher ein gebastel, nicht?


----------



## Gast2 (6. Jul 2010)

kommt halt drauf an was du alles in der Server Klasse machen willst. Aber z.B. so könnte die aussehen:


```
public Server {
    /** nen paar Variablen, z.b. */
    Socket s = null;

    public Server() {
        /** init */
    }

    public Response send(byte[] command) {
        /** command senden, Antwort lesen und zurückgeben */
    }
}
```


----------



## cay (6. Jul 2010)

Ja soweit ist mir die Serverklasse klar. Aber wie muss ich die initalisierung machen damit der Server Verbunden bleibt. Kannst du mir nicht ein beispiel der Serverklasse machen mit der methode send.

 public void send(String command) {

                    out.writeBytes (command);
                    out.flush();


    }


Weil mir ist noch unklar. Besten dank.


----------



## Gast2 (6. Jul 2010)

Du darfst gerne ein wenig mitdenken, es stand doch nun schon wirklich fast alles da 


```
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

/**
 *
 * @author Eike
 */
public class Server {
    private Socket server = null;
    private DataOutputStream out = null;

    public Server() throws IOException {
        server = new Socket("192.168.0.1", 23);
        out = new DataOutputStream(server.getOutputStream());
    }

    public void send(String command) throws IOException {
        out.writeBytes(command);
        out.flush();
    }

    /** Beispiel zur Anwendung */
    public static void main(String[] args) {
        try {
            Server s = new Server();
            s.send("Ein Command");
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}
```


----------



## cay (6. Jul 2010)

Danke jetzt habe ich noch folgenden Fehler in der Klasse GUI und zwar auf folgender zeile:

s = new Server();   >> unreported exception java.io.IOException; must be caught or declared to be thrown



```
import java.io.*;
import java.net.Socket;
 
/**
 *
 * @author Eike
 */
public class Server {
    public Socket server = null;
    public DataOutputStream out = null;
 
    public Server() throws IOException {
        server = new Socket("192.168.0.1", 23);
        out = new DataOutputStream(server.getOutputStream());
    }
 
    public void send(String command) throws IOException {
        out.writeBytes(command);
        out.flush();
    }
}
```


und Klasse GUI


```
/****************************************************************/
/*                      GUI	                            */
/*                                                              */
/****************************************************************/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * Summary description for GUI
 *
 */
public class GUI extends JFrame
{
	// Variables declaration
	private JTextPane jTextPane1;
	private JButton jButton1;
	private JButton jButton2;
	private JButton jButton3;
	private JPanel contentPane;
	public Server s;
	// End of variables declaration


	public GUI()
	{
		super();
		initializeComponent();
		s = new Server();
		//
		// TODO: Add any constructor code after initializeComponent call
		//

		this.setVisible(true);
	}

	/**
	 * This method is called from within the constructor to initialize the form.
	 * WARNING: Do NOT modify this code. The content of this method is always regenerated
	 * by the Windows Form Designer. Otherwise, retrieving design might not work properly.
	 * Tip: If you must revise this method, please backup this GUI file for JFrameBuilder
	 * to retrieve your design properly in future, before revising this method.
	 */
	private void initializeComponent()
	{
		jTextPane1 = new JTextPane();
		jButton1 = new JButton();
		jButton2 = new JButton();
		jButton3 = new JButton();
		contentPane = (JPanel)this.getContentPane();

		//
		// jTextPane1
		//
		jTextPane1.setText("Info");
		//
		// jButton1
		//
		jButton1.setText("set");
		jButton1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				jButton1_actionPerformed(e);
			}

		});
		//
		// jButton2
		//
		jButton2.setText("clr");
		jButton2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				jButton2_actionPerformed(e);
			}

		});
		//
		// jButton3
		//
		jButton3.setText("get");
		jButton3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				jButton3_actionPerformed(e);
			}

		});
		//
		// contentPane
		//
		contentPane.setLayout(null);
		addComponent(contentPane, jTextPane1, 9,103,351,138);
		addComponent(contentPane, jButton1, 11,10,83,28);
		addComponent(contentPane, jButton2, 12,40,83,28);
		addComponent(contentPane, jButton3, 11,72,83,28);
		//
		// GUI
		//
		this.setTitle("GUI - extends JFrame");
		this.setLocation(new Point(0, 0));
		this.setSize(new Dimension(390, 300));
	}

	/** Add Component Without a Layout Manager (Absolute Positioning) */
	private void addComponent(Container container,Component c,int x,int y,int width,int height)
	{
		c.setBounds(x,y,width,height);
		container.add(c);
	}

	//
	// TODO: Add any appropriate code in the following Event Handling Methods
	//
	private void jButton1_actionPerformed(ActionEvent e)
	{
		jTextPane1.setText("Setzten.");
		s.send("Ein Command");
		// TODO: Add any handling code here

	}

	private void jButton2_actionPerformed(ActionEvent e)
	{
		jTextPane1.setText("Löschen.");
		s.send("Ein Command");
		// TODO: Add any handling code here

	}

	private void jButton3_actionPerformed(ActionEvent e)
	{
		jTextPane1.setText("Get Wert.");
		s.send("Ein Command");
		// TODO: Add any handling code here

	}

	//
	// TODO: Add any method code to meet your needs in the following area
	//






























 

//============================= Testing ================================//
//=                                                                    =//
//= The following main method is just for testing this class you built.=//
//= After testing,you may simply delete it.                            =//
//======================================================================//
	public static void main(String[] args)
	{
		JFrame.setDefaultLookAndFeelDecorated(true);
		JDialog.setDefaultLookAndFeelDecorated(true);
		try
		{
			UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
		}
		catch (Exception ex)
		{
			System.out.println("Failed loading L&F: ");
			System.out.println(ex);
		}
		new GUI();
	}
//= End of Testing =


}
```


----------



## Gast2 (6. Jul 2010)

Da steht doch wo es dran liegt, google ("java unreported exception") liefert auch genug Ergebnisse...
Du darfst natürlich den try-catch-block nicht einfach weglassen, der steht da nicht aus lauter spaß an der freude 

PS: Beschäftige dich doch mal mit den Grundlagen.


----------



## cay (7. Jul 2010)

Habe doch noch eine frage. Was ist falsch an der Klasse Server, dass wenn man die methode send aufruft den Fehler   java.lang.NullPointerException bekommt?



```
import java.io.*;
import java.net.Socket;
 
/**
 *
 * @author Eike
 */
public class Server {
    public Socket server = null;
    public DataOutputStream out = null;
 
    public Server(){
        try
            {
                System.out.print("waiting ... ");
                Socket server = new Socket("192.168.0.74", 23);  
                DataOutputStream out = new DataOutputStream(server.getOutputStream());
                System.out.println("connected!");
                 }
            catch (Exception e)
            {
                System.out.println (e);
        }
    }
 
    public void send(String command) {
        try
            {
            out.writeBytes(command);
            out.flush();
            }
            catch (Exception e)
            {
                System.out.println ("Fehler beim senden"+ e);
        }
    }
}
```


----------



## VfL_Freak (7. Jul 2010)

Moin,

WO und WIE rufst Du "send" denn auf ???:L

Ich vermute aufgrund Deiner ungenauen Beschreibung jedoch, dass Du einen leeren String (NULL) übergibst 

Gruß
Klaus


----------



## cay (7. Jul 2010)

Hier mein Code:


Server Klasse

```
import java.io.*;
import java.net.Socket;
 
/**
 *
 * @author Eike
 */
public class Server {
    public Socket server = null;
    public DataOutputStream out = null;
 
    public Server(){
        try
            {
                System.out.print("waiting ... ");
                Socket server = new Socket("192.168.0.74", 23);  
                DataOutputStream out = new DataOutputStream(server.getOutputStream());
                System.out.println("connected!");
                 }
            catch (Exception e)
            {
                System.out.println (e);
        }
    }
 
    public void send(String command) {
        try
            {
            out.writeBytes(command);
            out.flush();
            }
            catch (Exception e)
            {
                System.out.println ("Fehler beim senden"+ e);
        }
    }
}
```


GUI Klasse

```
/****************************************************************/
/*                      GUI                             */
/*                                                              */
/****************************************************************/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * Summary description for GUI
 *
 */
public class GUI extends JFrame
{
    // Variables declaration
    private JTextPane jTextPane1;
    private JButton jButton1;
    private JButton jButton2;
    private JButton jButton3;
    private JPanel contentPane;
    public Server s;
    // End of variables declaration


    public GUI()
    {
        super(  );
        initializeComponent();
        s = new Server();
        //
        // TODO: Add any constructor code after initializeComponent call
        //
        this.setVisible(true);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always regenerated
     * by the Windows Form Designer. Otherwise, retrieving design might not work properly.
     * Tip: If you must revise this method, please backup this GUI file for JFrameBuilder
     * to retrieve your design properly in future, before revising this method.
     */
    private void initializeComponent()
    {
        jTextPane1 = new JTextPane();
        jButton1 = new JButton();
        jButton2 = new JButton();
        jButton3 = new JButton();
        contentPane = (JPanel)this.getContentPane();

        //
        // jTextPane1
        //
        jTextPane1.setText("Info");
        //
        // jButton1
        //
        jButton1.setText("set");
        jButton1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                jButton1_actionPerformed(e);
            }

        });
        //
        // jButton2
        //
        jButton2.setText("clr");
        jButton2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                jButton2_actionPerformed(e);
            }

        });
        //
        // jButton3
        //
        jButton3.setText("get");
        jButton3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                jButton3_actionPerformed(e);
            }

        });
        //
        // contentPane
        //
        contentPane.setLayout(null);
        addComponent(contentPane, jTextPane1, 9,103,351,138);
        addComponent(contentPane, jButton1, 11,10,83,28);
        addComponent(contentPane, jButton2, 12,40,83,28);
        addComponent(contentPane, jButton3, 11,72,83,28);
        //
        // GUI
        //
        this.setTitle("GUI - extends JFrame");
        this.setLocation(new Point(0, 0));
        this.setSize(new Dimension(390, 300));
    }

    /** Add Component Without a Layout Manager (Absolute Positioning) */
    private void addComponent(Container container,Component c,int x,int y,int width,int height)
    {
        c.setBounds(x,y,width,height);
        container.add(c);
    }

    //
    // TODO: Add any appropriate code in the following Event Handling Methods
    //
    private void jButton1_actionPerformed(ActionEvent e)
    {
        jTextPane1.setText("Setzten.");
        
        s.send("port 2 set\r\n");
        
        // TODO: Add any handling code here

    }

    private void jButton2_actionPerformed(ActionEvent e)
    {
        jTextPane1.setText("Löschen.");
        s.send("port 2 clr\r\n");
        // TODO: Add any handling code here

    }

    private void jButton3_actionPerformed(ActionEvent e)
    {
        jTextPane1.setText("Get Wert.");
        s.send("port 2 get\r\n");
        // TODO: Add any handling code here

    }

    //
    // TODO: Add any method code to meet your needs in the following area
    //






























 

//============================= Testing ================================//
//=                                                                    =//
//= The following main method is just for testing this class you built.=//
//= After testing,you may simply delete it.                            =//
//======================================================================//
    public static void main(String[] args)
    {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JDialog.setDefaultLookAndFeelDecorated(true);
        try
        {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        }
        catch (Exception ex)
        {
            System.out.println("Failed loading L&F: ");
            System.out.println(ex);
        }
        new GUI();
    }
//= End of Testing =


}
```


----------



## Ruzmanz (8. Jul 2010)

Copy & Paste sind immer der Untergang für jeden Neuling. So nebenbei: Instanzvariablen bitte immer private, sofern du keine gute Begründung hast, warum sie etwas anderes sein könnten.




> private DataOutputStream out = null;
> 
> public Server(){
> try
> ...



Damit sollte es gehen. Habe einfach das DataOutputStream vor dem out weggemacht


----------

