/* ======================================================== */
/* == POD 98-99 --                                          */
/* -------------------------------------------------------- */
/* == Client/serveur d'expression arithmetiques             */
/* -- Fichier : Serveur.java                                */
/*                                                          */        
/* A sa creation, le serveur cree sa 'socket' d'ecoute et   */
/* demarre de son propre chef (voir constructeur)           */
/* Le serveur :                                             */
/*           - cree une 'socket' de service;                */
/*           - cree un processus de service et le lance.    */
/* La fonction de service est definie dans la classe        */
/* 'Service' du fichier 'Service.java'                      */
/* ======================================================== */
import java.io.* ;
import java.net.* ;

// Classe principale (et unique)
public class Serveur extends Thread
{
    // Numero de service
    static int numero = 0;
    // Le numero du port 
    static int port;  
    // La 'socket' d'ecoute
    static ServerSocket sock;
    // Un canal de sortie pour le fichier de trace
    static PrintWriter trace = new PrintWriter(System.out,true) ;

    // Le constructeur : procede a l'initialisation de le 'socket'
    // d'ecoute et au lancement du serveur
    public Serveur (int p)
    { 
	// Port : initialisation
	port = p;

	// Creation de la 'socket' d'ecoute
	try 
	    { sock = new ServerSocket(port) ; }
	catch (IOException e) 
	    {  
		System.err.println(e.getMessage());
		System.exit(1); 
	    }
	// Trace 
	trace.println("### Serveur en ecoute sur le port "+port);
	// Demarrage
	this.start();
    }

    // La methode qui court
    public void run ()
    {
	try
	    {  
		while (true)
		    {  
			// 'Socket' de service
			Socket serSock = sock.accept ();
			// Trace : debut de connection
			trace.println("# Connection etablie avec : "
				      + serSock.getInetAddress().getHostName());
			// Creation du service
			Thread service = (Thread) new Service (serSock,trace, ++numero);
			// Lancement du service
			service.start() ;
		    }
	    }
	catch (IOException e)
	    {  
		System.err.println(e.getMessage());
		System.exit(1);
	    }
    }

    // Methode principale
    public static void main (String args[])
    {  	
	// Information incomplete sur la ligne de commande :
	// on arrete ...
	if (args.length < 1)
	    {
		System.err.println("Serveur : usage port_number");
		System.exit(1);
	    }

	// Numero de port : initialisation
	try
	    {
		new Serveur((Integer.valueOf(args[0])).intValue());
	    }
	catch (NumberFormatException e) // Erreur de conversion
	    {
		System.err.println("Serveur : bad port_number "+args[0]);
		System.exit(1);
	    }
  }

}
