# Client-Server mittels AWT



## ebruss17 (24. Dez 2012)

Hallo Leute,

ich habe ein Client-Server-Programm geschrieben. Nun muss ich das mit AWT erweitern, sodass zum Schluss eine GUI verfügbar ist. Client und Server funktionieren auch ganz gut und die Kommunikation zwischen Client und Server auch. Jetzt möchte ich beim Server 3 Methoden implementieren: "Serverstart" "Serverstopp" "Serverport einstellen" damit wenn der Client eine von den 3 Buttons anklickt, je nachdem der Server gestartet gestoppt oder um den Serverport einzustellen. Hier mein Code zum Server: 


```
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.awt.*;
import java.awt.event.*;


/**
 * @author zengin
 * Mithilfe der Klasse Server findet die Kommunikation zwischen dem Client
 * und dem Server über den Socket 45678 statt. Diese Klasse wurde so implementiert,
 * sodass sich mehrere Clients beim Server anmelden können. Der Server ist also
 * multi-user-fähig. Der Server protokolliert seine Aktivitäten mit Datum - und
 * Zeitausgabe in eine Logfile mit dem Datei-Namen "logfile.csv".
 */
public class Server extends Frame implements ActionListener, MouseListener {

    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	File serverdatei = new File("logfile.csv");
    private static ArrayList<String> eintragsliste = new ArrayList<String>();
    int anzahlClients = 0;
   /*MenuBar menuBar;
   Menu menu;
   Menu menu1;
   MenuItem menuItem;*/
   PopupMenu popup;
   Label label;
   Button serverStart;
   Button serverStopp;
   Button serverPort;
   int portStandard = 12345;
   
   Label lServerPort;
   Label lClients;
   Label lServerGestartet;
   Label lServerEnde;
   
   TextField textClients;
   TextField textPorteingeben;
   
  public Server()
  {
	  super("Server-GUI");
	  this.setSize(200,130);
	  this.setLocation(100,250);
	  this.setLayout(null);
	  this.setBackground(Color.lightGray);
	
	  MenuBar menuBar = new MenuBar();
	  this.setMenuBar(menuBar); 
	  Menu menu = new Menu("Datei");
	  menuBar.add(menu);
	  MenuItem menuItem = new MenuItem("Oeffnen", new MenuShortcut(KeyEvent.VK_O));
	  menuItem.addActionListener(this);
	  menu.add(menuItem);
	  menu.addSeparator();
	  menuItem = new MenuItem("Datenbank auswählen");
	  menuItem.addActionListener(this);
	  menu.add(menuItem);
	  menu.addSeparator();
	  menuItem = new MenuItem("Beenden");
	  menuItem.addActionListener(this);
	  menu.add(menuItem);
	  menu = new Menu("Info");
	  menuBar.add(menu);
	  menuItem = new MenuItem("Info", new MenuShortcut(KeyEvent.VK_I));
	  menuItem.addActionListener(this);
	  menu.add(menuItem);
	  
	  popup = new PopupMenu();
	  this.add(popup);
	  MenuItem mItem = new MenuItem("Datei Öffnen");
	  mItem.addActionListener(this);
	  popup.add(mItem);
	  popup.addSeparator();
	  mItem = new MenuItem("Datenbank auswählen");
	  mItem.addActionListener(this);
	  popup.add(mItem);	
	  popup.addSeparator();
	  mItem = new MenuItem("Beenden");
	  mItem.addActionListener(this);
	  popup.add(mItem);	
	  
	  label = new Label();
	  label.setSize(320,30);
	  label.setLocation(25, 250);
	  add(label);
	  
	 
	  
	  lServerEnde = new Label("Der Server wurde erfolgreich beendet");
	  lServerEnde.setSize(240, 30);
	  lServerEnde.setLocation(70, 300);
	  add(lServerEnde);
	  lServerEnde.setVisible(false);
	  
	  lServerPort = new Label("Der Serverport ist: ");
	  lServerPort.setSize(100,30);
	  lServerPort.setLocation(70, 500);
	  add(lServerPort);
	  
	  lClients = new Label("Clients, die sich angemeldet haben");
	  lClients.setSize(250, 30);
	  lClients.setLocation(70, 600);
	  add(lClients);

	  serverStart = new Button("Serverstart");
	  serverStart.setSize(150, 30);
	  serverStart.setLocation(45, 100);
	  serverStart.addMouseListener(this);
	  add(serverStart);
	
	  
	  serverStopp = new Button("Serverstopp");
	  serverStopp.setSize(150, 30);
	  serverStopp.setLocation(45, 300);
	  serverStopp.addMouseListener(this);
	  add(serverStopp);
	  serverStopp.setVisible(true);
	  
	  
	  serverPort = new Button("Serverport übernehmen");
	  serverPort.setSize(150, 30);
	  serverPort.setLocation(90,140);
	  serverPort.addMouseListener(this);
	  add(serverPort);
	  
	  String portwert = "" + portStandard;
	  textPorteingeben = new TextField(portwert);
	  textPorteingeben.setSize(100,30);
	  textPorteingeben.setLocation(120, 140);
	  add(textPorteingeben);
	  
	  
	  String zaehleClients = "" + anzahlClients;
	  textClients = new TextField(zaehleClients);
	  textClients.setEditable(false);
	  textClients.setSize(30,30);
	  textClients.setLocation(200,200);
	  add(textClients);
	  
	
	  
	  this.setVisible(true);
	  this.addWindowListener(new WindowAdapter()
	  {
		  public void windowClosing(WindowEvent we)
		  {
			  System.exit(0);
		  }
	  });
	  this.enableEvents(AWTEvent.MOUSE_EVENT_MASK);
	 }
  
public void processMouseEvent(MouseEvent me)
	{
		if(me.isPopupTrigger())
	
			popup.show(me.getComponent(), me.getX(), me.getY());
	}
  

  public void actionPerformed(ActionEvent ae)
  {
	  Object o = ae.getSource();
	  if(((MenuItem)o).getLabel().equals("Oeffnen"))
	  {
		  FileDialog fileDialog = new FileDialog(this, "Datei Oeffnen", FileDialog.LOAD);
		  fileDialog.setVisible(true);
		  label.setText("Datei " + fileDialog.getDirectory() + fileDialog.getFile() + " ausgewählt");
	  }
	  else if(((MenuItem)o).getLabel().equals("Datenbank"))
	  {
		  FileDialog fileDialog = new FileDialog(this, "Datenbank auswählen", FileDialog.LOAD);
		  fileDialog.setVisible(true);
		  label.setText("Datenbank " + fileDialog.getDirectory() + fileDialog.getFile() + " ausgewählt");
	  }
	  else if(((MenuItem)o).getLabel().equals("Datenbank auswählen"))
	  {
		  FileDialog fileDialog = new FileDialog(this, "Datenbankauswahl", FileDialog.LOAD);
		  fileDialog.setVisible(true);
		  label.setText("Datenbank " + fileDialog.getDirectory() + fileDialog.getFile() + " ausgewählt");
	  }
	  
	  else if(((MenuItem)o).getLabel().equals("Datei Öffnen"))
	  {
		  FileDialog fileDialog = new FileDialog(this, "Datei Oeffnen", FileDialog.LOAD);
		  fileDialog.setVisible(true);
		  label.setText("Datei " + fileDialog.getDirectory() + fileDialog.getFile() + " ausgewählt");
	  }
	 
	  else if(((MenuItem)o).getLabel().equals("Beenden"))
	  {
		  MeinDialog meinDialog = new MeinDialog(this, "Ende-Dialog", "Wollen Sie die Anwendung wirklich beenden?");
		  if(meinDialog.getAntwort())
			  System.exit(0);
	  }
	  else if(((MenuItem)o).getLabel().equals("Info"))
	  {
		  @SuppressWarnings("unused")
		MeinDialog meinDialog = new MeinDialog(this, "Info", "Dieses Programm enthält ein Menü");
	  }
  }
  
  public void mouseEntered(MouseEvent arg0)
  {
	  
  }
  
  @Override
	public void mouseClicked(MouseEvent me) {
		// TODO Auto-generated method stub
	  if(me.getComponent() == serverStopp)
	  {
		  
	  }
	
	  if(me.getComponent() == serverStart)
	  {
	  }
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
  
  
    /**
     * Mithilfe der main-Methode findet die Kommunikation des Servers 
     * mit dem Client über Sockets statt. Die run-Methode
     * der Klasse Thread wird ebenfalls implementiert und überschrieben. 
     * Innerhalb der run-Methode werden Zeit- und Datumsformate definiert. 
     * Die Optionen, die der Client auswählt, werden dem Server als Anfrage geschickt
     * und werden auf der Konsole des Servers mit Zeit- und Datumsausgabe ausgegeben.
     * Mithilfe der Variable "schreibenUeberSocket" vom Typ BufferedWriter-Objekt
     * schreibt der Server dem Client über den Socket, ob die Auswahl des Clients
     * in Ordnung ist. Der Aufruf der Methode start() in Zeile 136 der Klasse Thread 
     * bewirkt, dass sich mehrere Clients mit dem Server verbinden können.
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws Exception
    {
    	@SuppressWarnings("unused")
		Server server = new Server();
       
		
       ServerSocket myServerSocket = new ServerSocket(45678);
        
        while(true)
        {
            final Socket myClientSocket = myServerSocket.accept();
            (new Thread(new Runnable()
            {
                public void run()
                {
                	try
                	{
                    BufferedReader lesenUeberSocket= new BufferedReader(new InputStreamReader(myClientSocket.getInputStream()));
                    BufferedWriter schreibenUeberSocket=new BufferedWriter(new OutputStreamWriter(myClientSocket.getOutputStream()));
                    
                    Label aktuelleZeit = new Label(aktuelleUhrzeit(new SimpleDateFormat("dd.MM.yyyy - HH:mm:ss")));
                    
                    
                    String anmeldung= aktuelleZeit + ";" + "Angemeldet an lokaler Adresse" + ";" 
                    				+ myClientSocket.getLocalAddress() + "\n";
                    eintragsliste.add(anmeldung);
                    writeLog(eintragsliste);
                    
                    System.out.println(
                    		"*************************" + "\n" + "> " + aktuelleZeit
                    		+ "\t" + "\t" +
                    		"--> Local Address angemeldet: "
                            + myClientSocket.getLocalAddress());
                    
                    String eingabeVonClientLesen;
                    
                    try
                    {
                        while((eingabeVonClientLesen = lesenUeberSocket.readLine()) != null)
                        {
                            int a=Integer.parseInt(eingabeVonClientLesen);
                            
                            if((a < 6) && (a > 0))
                            {
                                Label aktuelleZeit1 = new Label(aktuelleUhrzeit(new SimpleDateFormat("dd.MM.yyyy - HH:mm:ss ")));
                                choice(a, aktuelleZeit1);
                                writeLog(eintragsliste);
                                
                                System.out.println(
                                		"*************************" + "\n" + "> " + aktuelleZeit1
                                        + "\t" + "\t" + "Der Client hat den Menuepunkt \'"
                                        + a + "\' ausgewaehlt");
                                
                                
                                schreibenUeberSocket.write("Ihre Auswahl ist in Ordnung :-)");
                                schreibenUeberSocket.newLine();
                                schreibenUeberSocket.flush();
                            }
                            else
                            {
                                choice(a, aktuelleZeit);
                                writeLog(eintragsliste);
                                
                                System.out.println(
                                		"*************************" + "\n" + "> " + aktuelleZeit
                                        + "\t" + "\t" + "Ungueltige Eingabe!");
                                
                                schreibenUeberSocket.write("Ihre Auswahl ist leider nicht in Ordnung :-(");
                                schreibenUeberSocket.newLine();
                                schreibenUeberSocket.flush();
                            }
                        }
                    }
                    catch(Exception e)
                    {
                    	System.out.println(
                    			"*************************" + "\n" + e.getMessage());
                    }
                    System.out.println(
                    		"*************************" + "\n" + "> " + aktuelleZeit
                    		+ "\t" + "\t" +
                    		"<-- Local Address abgemeldet: "
                            + myClientSocket.getLocalAddress());

                    String abmeldung = aktuelleZeit + ";"
                            + "Abgemeldet von der lokalen Adresse" + ";"
                            + myClientSocket.getLocalAddress() + "\n";
                    
                    eintragsliste.add(abmeldung);
                    writeLog(eintragsliste);
                   myClientSocket.close();
                } catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}finally
                {
                	
                }
            }})).start();
        }
    }
    
    
    public void serverstart() {

    	

    	    }
    
    public static void serverstopp()
    {

    }
    
    
    /**
     * Diese Methode definiert die Zeit- und Datumsformate, die auf 
     * der Konsole des Servers und in der Logfile dementsprechend 
     * formatiert ausgegeben werden.
     */
    private static String aktuelleUhrzeit(SimpleDateFormat sdf)
    {
    	sdf = new SimpleDateFormat("dd.MM.yyyy - HH:mm:ss");
    	Date aktuelleZeit = new Date();
    	return sdf.format(aktuelleZeit);
    }
    
    
    /**
     * Mithilfe dieser Methode werden die einzelnen Einträge der Logfile formatiert.
     * Die einzelnen Case-Fälle, die der Client auswählt,
     * werden dann mit der entsprechend aktuellen Uhrzeit und dem aktuellen Datum
     * in die Datei "logfile.csv" hinzugefügt.
     * @param a
     * @param zeit
     */
    public static void choice(int a, Label zeit) {
        StringBuilder gebeString = new StringBuilder();
        gebeString.append(zeit);
        gebeString.append(";");

        switch (a) {
            case 1:
            	gebeString.append("Der Client hat den Menuepunkt ");
                gebeString.append(a + " ausgewaehlt");
                gebeString.append(";");
                gebeString.append("neue Person aufnehmen");
                gebeString.append(";");
                break;
            case 2:
            	gebeString.append("Der Client hat den Menuepunkt ");
                gebeString.append(a + " ausgewaehlt");
                gebeString.append(";");
                gebeString.append("Records auflisten");
                gebeString.append(";");
                break;
            case 3:
            	gebeString.append("Der Client hat den Menuepunkt ");
                gebeString.append(a + " ausgewaehlt");
                gebeString.append(";");
                gebeString.append("Records in eine Datei sichern");
                gebeString.append(";");
                break;
            case 4:
            	gebeString.append("Der Client hat den Menuepunkt ");
                gebeString.append(a + " ausgewaehlt");
                gebeString.append(";");
                gebeString.append("Datei löschen");
                gebeString.append(";");
                break;
            default:
                break;
        }

        gebeString.append("\n");

        eintragsliste.add(gebeString.toString());
    }

   
    /**
     * Mithilfe dieser Methode werden die Einträge 
     * in die serverdatei "logfile.csv" geschrieben.
     * Innerhalb dieser Methode werden die Zeichen-Stream-Klassen
     * BufferedWriter und FileWriter angewendet. Die
     * Zeichen-Stream-Klasse BufferedWriter schickt seine Daten
     * an FileWriter und dieser schreibt dann die Daten in die 
     * Datei "logfile.csv".
     */
    public static void writeLog(ArrayList<String> eintragsliste) {
        try {
       
            BufferedWriter bw = new BufferedWriter(new FileWriter("logfile.csv"));
            
            

            for (int i = 0; i < eintragsliste.size(); i++) {
                bw.write(eintragsliste.get(i));
            }

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

ich brauche dringend Hilfe. Es wäre nett, wenn jemand behilflich sein könnte!


----------



## Phash (24. Dez 2012)

du hast die MethodenRuempfe doch schon...
benutz die doch einfach...


Was genau ist denn deine Frage?


----------



## ebruss17 (24. Dez 2012)

laut Aufgabenstellung muss ich beim Server 3 methoden implementieren "Serverstart" "Serverstopp" "Serverport einstellen" und noch 3 Buttons, damit ich die 3 Methoden wenn ich die jeweiligen Buttons anklicke, z.b. der Server gestartet , gestoppt oder um den Serverport einzustellen.... Wie könnte ich das machen?


----------



## bERt0r (24. Dez 2012)

Ich würde Java, Swing und einen Layoutmanager verwenden.
Frohe Weihnachten!


----------



## ebruss17 (24. Dez 2012)

wir dürfen nur AWT verwenden und das auch ist nur prüfungsrelevant ABER meine Frage war, dass ich 3 Methoden schreiben muss und wie ich diese implementieren soll ....


----------



## Marcinek (24. Dez 2012)

Hi,

was hier prüfungsrelevant ist und was nicht, ist hier leider garnicht relevant.

Am aller einfachsten ist es drei ActionListener zu implementieren, die dann zu den drei Buttons hinzugefügt werden. In den jeweiligen Actionlistnern kannst du deine Logik unterbringen.

Einfach mal googeln nach: Java ActionListener example

Gruß,

Martin


----------



## benhaze (25. Dez 2012)

Also, abgesehen davon das ich fast gar nicht glaube das du den code *selber* geschrieben hast aber Weihnachten ist, hier was mir so aufgefallen ist:

- an welcher Stelle wird deine GUI *sichtbar* gemacht?
- (ich frage weil deine main()-methode den server (socket-listen) *startet*, nicht aber das Fenster sichtbar macht.
-  @SuppressWarnings("unused") ist in meinen Augen Blödsinn. Ich meine UNUSED!? hallo?!?!
Ein Kommentar, weswegen eine UNUSED Variable/Ausdruck dennoch existieren sollte, wäre IMHO besser.
- dein SimpleDateFormat("dd.MM.yyyy - HH:mm:ss") könnte static final sein. (Achtung: ist aber nicht ThreadSafe...deswegen im synchronized-block)

Um zurück zu deiner Frage zu kommen:
Innerhalb deiner while(true)-Schleife, könntest du einen Status-Prüfen (z.b eine Variable), welcher über einen deiner Button geändert werden kann. (m_socketAccept = true/false)
Je nach Status dann, Verbindungen annehmen oder nicht.


----------



## bERt0r (25. Dez 2012)

Ich mach dir ein Weihnachtsgeschenk:
Dein StartServer button muss den ServerSocket öffnen und diesen while(true){serverSocket.accept()} Thread starten.
Der StopServer button muss den ServerSocket schließen, dann sollte der Thread beendet werden (da brauchst du noch Abbruchbedingungen).
Für deinen Serverport brauchst du eine Variable, damit du diesen dynamisch einstellen kannst.


----------



## ebruss17 (25. Dez 2012)

Hey,

echt klasse, dass mir endlich jemand antwortet, Nun Wie öffne ich den Serversocket?


----------



## Marcinek (25. Dez 2012)

Hey,

was sagt googel dazu?

Gruß,

Martin


----------



## bERt0r (25. Dez 2012)

Wenn du den Code schon nicht selber schreibst, solltest du ihn zumindest verstehen lernen. Ansonsten wird das nix. Frag ansonsten "zengin" ob er/sie dir hilft.


----------



## ebruss17 (25. Dez 2012)

ich weiss schon was die einzelnen Codes aussagen, jedoch weiss ich nciht wie ich das umsetzen kann per AWT :S


----------



## Marcinek (25. Dez 2012)

Was hat eine ServerSocket mit AWT zu tun? :bahnhof:

Weißt du, was AWT bedeutet?


----------



## ebruss17 (25. Dez 2012)

ich muss 3 Methoden erstellen: Serverstart, Serverstopp, Serverport einstellen und weiss nicht was ich im oben geposteten Code in die jeweiligen Methoden übernehmen muss..... arghhh


----------



## Marcinek (25. Dez 2012)

Sorry, ich befürchte dein Anliegen wird nur in der JobBörse gelöst werden können.


----------



## ebruss17 (25. Dez 2012)

kann mir denn wirklich niemand behilflich sein?


----------



## Marcinek (25. Dez 2012)

Noch mehr helfen würde aber bedeuten die Aufgabe für dich zu Lösen.

Aber dafür ist das forum nicht da.


----------



## ebruss17 (25. Dez 2012)

ich weiss aber nur die 3 Methoden fehlen noch... und ich weiss nicht wie ich die einzelnen Codes da rein implementieren soll, ich glaub das würde sich eigentlich sehr schnell lösen


----------



## Marcinek (25. Dez 2012)

Hast du schon diese drei Methoden?

Hast du schon drei Action Listener implementiert, wie weiter oben vorgeschlagen?

Hast du nach ServerSockets gegoogelt?

Hast du überhaupt etwas selber gemacht?

---

Du hast keine Lust das zu machen, wieso sollte es jemand anders haben?


----------



## ebruss17 (25. Dez 2012)

diese 3 Methoden sind noch leer und das, was in die jeweiligen methoden rein muss, ist alles in der public static void main Methode innerhalb der Klasse was ich oben gepostet habe. ich weiss nun nicht wie ich die einzelnen Codes da rausnehmen muss und in die jeweiligen Methoden reinschreiben muss...


----------



## Marcinek (25. Dez 2012)

Ich müsste dich hier nun auf Grundlagenwissen verweisen.

Was genau klappt da nicht?


----------



## ebruss17 (25. Dez 2012)

also ich drücke auf den Serverstart-Button aber es geschieht nichts, da ich ja dem Button auch noch nichts innerhalb der if-Abfrage zuweise! innerhalb meiner public static void main Methode erstelle ich einen Serversocket und die Kommunikation über Sockets. Das alles funktioniert wunderbar, jedoch weiss ich nicht genau welche Codeteile für die Serverstart-Methode von Nützen sind, damit wenn ich den Serverstart-Button klicke der server gestartet wird.


----------



## Marcinek (25. Dez 2012)

Die gesamte Main Methode startet einen Server.


----------



## ebruss17 (25. Dez 2012)

genau! soll ich dann die ganzen Sachen inner halb der main-Methode in die Methode serverstart() reinkopieren?


----------



## Marcinek (25. Dez 2012)

Lerne bitte vorher die Grundlagen von Java.


----------



## ebruss17 (25. Dez 2012)

Hi Leute,

also ich brauche wirklich dringend Hilfe, da ich mein Projekt nächste Woche abgeben muss. Ich wäre für jede Hilfe sehr dankbar. Nochmals vielen Dank..


----------



## Marcinek (25. Dez 2012)

Hi,

sorry, wir machen hier keine Hausaufgaben.

Du hast leider nicht die benötigten Grundlagen um dir hier effizient zu helfen. 

Eventuell solltest du dich an den Urheber des Codes im ersten Postings wenden.

Selbst wenn du das abgibst und der Prüfer einmal googelt landet er sofort in diesem Thread. Und damit wäre die "Hilfe" in form einer Lösung sinnlos und vertane Zeit.

Gruß,

Martin


----------



## bERt0r (27. Dez 2012)

Ich finds jedenfalls bewundernswert wie du so viel Zeit und Geduld in derartige Threads stecken kannst. Dafür gibst von mir jedenfalls mal ein Danke  Is ja Weihnachten.


----------

