/* ======================================================== */
/* == POD 98-99 --                                          */
/* -------------------------------------------------------- */
/* == Client/serveur d'expression arithmetiques             */
/* -- Fichier : Client.java                                 */
/*                                                          */
/* Le client :                                              */
/*          - ouvre une 'socket' de communication           */
/*          - emet une expression arithmetique (pour        */
/*            evaluation)                                   */
/*          - lit la reponse (valeur de l'expression emise) */
/*          - emet un acquitement                           */
/* L'adresse du serveur et le numero de port du service     */
/* sont lus sur la ligne de commande.                       */
/* L'attente de la reponse du serveur n'excedera pas un     */
/* certain delai.                                           */
/* ======================================================== */

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

/**
   La classe principale
*/
public class Client 
{
    // LA classe
    public static void main (String args[])
    {
	// Information incomplete sur la ligne de commande :
	// on arrete ...
	if (args.length < 2)
	    {
		System.err.println("Client : usage host_name port_number");
		System.exit(1);
	    }
	
	// Adresse IP du serveur de calcul : initialisation
	String host = args[0];; 

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

	// Socket de comunication
	Socket sock = null;

	try
	    {
		// Creation de la 'socket' de communication
		sock = new Socket (host,port); 

		// Delai maximal d'attente (en millisecondes)
		sock.setSoTimeout(2000);

		// Le canal de sortie correspondant a la 'socket' 
		ObjectOutputStream out = 
		    new ObjectOutputStream (sock.getOutputStream());

		// Creation d'une expression
		Arith e = (Arith) 
		    new Times(new Plus(new Entier(3),new Entier(5)),
			      new Entier(7));

		// Emission de l'expression
		out.writeObject(e);


		// Le canal d'entree :
		// son ouverture est bloquante, c'est pourquoi 
		// on ne l'ouvre que maintenant
		ObjectInputStream in = 
		    new ObjectInputStream (sock.getInputStream());
		
		// Reception du resultat sous la forme d'un Integer
		Integer result = (Integer) in.readObject();

		// Affichage du resultat
		System.out.println(e.toString() + " = " + result);

		// Emission de l'aquitement
		out.writeObject("OK!");

		// Fermeture de la connexion
		sock .close() ;
	    }
	catch (InterruptedIOException e) // sortie sur 'time out'
	    { System.err.println("Client : time out"); }
	catch (IOException e) 
	    { System.err.println(e); }
	finally // pour fermeture effective de la 'socket'
	    {
		try {if (sock!=null) sock.close(); }
		catch (IOException e1) { }
	    }
    }
}
