import java.awt.*;
import java.io.*;
import java.net.*;

public class Calc
{
    public static DataInputStream A_in;     // Input Stream per Add
    public static PrintStream A_out;        // Output Stream per Add
	public static Socket A_client;          // Socket di comunicazione per Add
    public static DataInputStream S_in;     // Input Stream per Sub
    public static PrintStream S_out;        // Output Stream per Sub
	public static Socket S_client;          // Socket di comunicazione per Sub
	public static boolean Loop;

    /* Questa procedura esegue l'addizione dei due operandi passati.
    Per fare ciņ manda i due dati alla funzione che esegue materialmente l'addizione
    (classe Add) attraverso il canale Socket A_client e i suoi stream.
    Infine legge il risultato che la classe Add pone sullo stesso Socket
    */
    public static void Add(String op1,String op2) throws Exception
    {
        String ris;

        ris="";
        A_out.println(op1);
        A_out.println(op2);
        ris=A_in.readLine();

        System.out.println(op1+"+"+op2+"="+ris);
    }
    /* Analogamente alla funzione Add, questa procedura esegue la funzione Sub.
    Passa i dati alla classe Sub tramite il canale Socket S_client e i suoi stream,
    infine, come la Add, legge il risultato mandato dalla classe Sub.
    */
    public static void Sub(String op1,String op2) throws Exception
    {
        String ris;

        ris="";
        S_out.println(op1);
        S_out.println(op2);
        ris=S_in.readLine();

        System.out.println(op1+"-"+op2+"="+ris);
    }
    /* Funzione che gestisce la calcolatrice.
    La procedura č estremamente semplice: si limita a chiedere l'operazione (add, sub o quit)
    e i parametri.
    In base al tipo di operazione richiesto chiama la procedura corretta, oppure termina
    il ciclo.
    */
    public static void Calc() throws Exception
    {
        String Op,Op1,Op2;
        DataInputStream In;

        Op=Op1=Op2="";
        In=new DataInputStream(System.in);
        System.out.println("Calcolatrice MultiThread\n");
        System.out.println("Inserire l'operazione da fare [Add/Sub/Quit]");
        Op=In.readLine();
        if(Op.compareTo("Quit")!=0)
            {
                System.out.println("Inserire il primo operando");
                Op1=In.readLine();
                System.out.println("Inserire il secondo operando");
                Op2=In.readLine();
                if(Op.compareTo("Add")==0)
                    Add(Op1,Op2);
                else
                    if(Op.compareTo("Sub")==0)
                        Sub(Op1,Op2);
                    else
                        System.out.println("Operazione non valida");
            }
        else
            Loop=false;
    }

    /* A questa funzione vanno passato due parametri:
        - Host dove si trova la Add
        - Host dove si trova la Sub
    */
	public static void main(String args[])
    {
        try
            {
    			A_client = new Socket(args[0],12000);
    			S_client = new Socket(args[1],12001);
                A_out = new PrintStream(A_client.getOutputStream());
            	A_in = new DataInputStream(A_client.getInputStream());
                S_out = new PrintStream(S_client.getOutputStream());
            	S_in = new DataInputStream(S_client.getInputStream());
            	Loop=true;
    			while(Loop)
    			    Calc();
            }
		catch (Exception e)
		    {
		        System.out.println("Calc: Errore di comunicazione");
		    }
    }
}

