import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.io.PrintWriter;
import java.util.ArrayList;

/**
  * Die Klasse MyServer verwaltet einen ServerSocket. Sie erstellt einen ServerSocket an einem
  * bestimmten Port und wartet dort auf Clients. Es können mehrere Clients gleichzeitig angemeldet sein.
  * Eine Klasse, die diesen Server benutzt, muss MyServerSocketListener implementieren. Sie wird dann
  * über die Methode neuerClient informiert, wenn sich ein neuer Client am Server angemeldet hat.
  * Beschreibung
  *
  *
  * @version 1.0 vom 15.11.2012
  * @author Thomas Schaller
  */

public class MyServer extends Thread {

  // Anfang Attribute
  private ServerSocket ss;
  private int port;
  private boolean aktiv = true;
  private MyServerSocketListener listener;
  // Ende Attribute
  
  /** Dieser Konstruktor erzeugt einen neuen ServerSocket, startet ihn aber nicht sofort.
     * @param listener Klasse, die MyServerSocketListener implementiert und dann über neue Clients und eingehende Nachrichten informiert wird.
     * @param port Port, den der ServerSocket abhört.
     */
  
  public MyServer(MyServerSocketListener listener, int port) {
    this.port = port;
    this.listener = listener;
    try {
      ss = new ServerSocket(port);
    } catch(Exception e) {
      System.out.println(e);
    } // end of try
  }

  // Anfang Methoden
  /** Liefert den Port, den der Server abhört.
  * @return Port
  */
  public int getPort() {
    return port;
  }
  
  /** Startet das Abhören des Ports und das Annehmen der Clients
  */
  public void starten() {
    start();
  }
  
  /** Verwaltet das Annehmen der Clients (Diese Methode bitte nicht direkt aufrufen, sondern mit starten() aktivieren).
  */
  public void run() {
    aktiv = true;
    try {
      while(aktiv) {
        System.out.println("Warte auf Client");
        Socket s = ss.accept();
        System.out.println("Client empfangen");
        MySocket ms = new MySocket(s, listener);
        listener.neuerClient(ms);
      }
    } catch(Exception e) {
       System.out.println(e);
    } // end of try
    
    
  }
  
  /** Bricht das Abhören des Ports ab. Es kann nicht wieder durch starten aktiviert werden. Dazu muss ein neuer Server erstellt werden.
  */
  public void stoppen() {
    aktiv = false;
    try{
      ss.close();
      interrupt();
       } catch( Exception e) {
         System.out.println(e);
         }
  }
  
  /** Meldet, ob der Server aktiv ist.
  * @return true, falls der Server den Port abhört, sonst false.
  */
  public boolean getAktiv() {
    return aktiv;
  }

  // Ende Methoden
} // end of Server


