//
//###################################################################
//                   Class Front2
//###################################################################
//  The "front" component of a sample distributed application.
//
//  This sample demonstrates the communication of an object using
//  serialization (user defined). 
//
//  This sample is run "locally".
//
//  Creator               : Chris Anderson
//  (C) UCLA 1997
//
//  Updated 07/15/98 CRA  
//###################################################################
//
import java.io.*;
import cam.netapp.NetworkConnection;

public class Front2 implements Runnable
{
//
//################################################################
//  Data Members
//################################################################
//
//  Streams for communication
//
    InputStream  FrontInputStream;
    OutputStream FrontOutputStream;
//
//  NetworkConnection : a class to facilitate stream
//  connection and control of a remote class.
//
    NetworkConnection netConnect;
//  
//  remote class name, remote address and remote port 
//
    public String  remoteClassName;
    public String      inetAddress;
    public int          portNumber; 
//
//################################################################
//  METHODS
//################################################################
//
public Front2()
{
    remoteClassName = "Back2";
    inetAddress     = "127.0.0.1"; // default = loopback
    portNumber      = 6789;        // default.   
}

public void setRemoteClassName(String rName)
{
    remoteClassName = new String(rName);
}

public void setRemoteAddress(String iAddress)
{
    inetAddress = new String(iAddress);
}

public void setRemotePort(int rPort)
{
    portNumber = rPort;
}

public void run()
{
    System.out.println("Front2 : Running");
//
//  Create a connection with a "remote" class
//
    netConnect = new NetworkConnection();
    netConnect.setVerboseFlag(true);       // set to true for
                                           // diagnostics 
//
//  Set up a network connection to remote application using the 
//  values of class data members inetAddress, portNumber 
//  and remoteClassName
//
    try
    {netConnect.connectRemoteApplication(inetAddress,portNumber,remoteClassName);}
    catch(Exception e){System.out.println(e);}
//
//  Capture streams
//
    FrontInputStream  = netConnect.getInputStream();
    FrontOutputStream = netConnect.getOutputStream();
//
//  Start remote application
//
    netConnect.startRemoteApplication();
//
//  Exchange data with the remote class
//
    System.out.println("Front : Sending Data");
//
//  create a ParameterList
//
    cam.dataxchg.ParameterList P = new cam.dataxchg.ParameterList("Test Parameters");
    P.addDouble(" dt ",1.0);
    P.addInt(" N ", 100);
//
//  send
//
    P.output(FrontOutputStream);
//
//  receive (using the binary version as an example...)
//
    P.inputBinary(FrontInputStream);

    System.out.println("Front : Values Received ");
    System.out.println("Front : ");
    P.output(System.out);

    netConnect.stopRemoteApplication();
}
public static void main(String[] args)
{
   Front2 F = new Front2();
   
   F.setRemoteClassName("Back2");   // name of remote class 
   F.setRemoteAddress("127.0.0.1"); // local loopback
   F.setRemotePort(6789);           // port that server manager is listening on
   
   Thread Frun2 = new Thread(F);
   Frun2.start();
   BufferedReader D = new BufferedReader(new InputStreamReader(System.in));
   try{D.readLine();}catch(Exception e){}
}// main()

}