// =======================================================================
//
// Java network server.
//
// A simple server that always answers the clients requests and loops
// forever.
//
// CS 440 Example
// Harkin, 8.99
//
// ========================================================================

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

public class Server
{
   
   static final int DEFAULT_PORT = 9999;
   static final int BUFLEN = 80;

   // Main

   static public void main (String [] argv)
   {
      int               port;
      ServerSocket      server_sock;
      Socket            conn_sock;
      OutputStream      out_stream;
      InputStream       in_stream;
      DataOutputStream  dout_stream;
      String            msg = new String ("Message Received");
      char              ch;

      System.out.println ("Java server starting - whoo, whoo"); 

      try
      {
         // Set up the desired port

         if (argv.length > 0)
            port = Integer.parseInt (argv [0]);
         else
            port = DEFAULT_PORT;

         // Create a server socket object and output a message.

         server_sock = new ServerSocket (port, 10);
         System.out.println ("Server socket open " + server_sock.toString()); 


         // Loop getting the input from the client and sending back a
         // message.

         while (true)
         {

            // Wait for a client to connect and return the client socket.

            conn_sock = server_sock.accept ();
            System.out.println ("Connected " + conn_sock.toString ()); 
   
            // Get the associated streams so that I/O can take place
            // with the client.

            in_stream = conn_sock.getInputStream ();
            out_stream = conn_sock.getOutputStream ();
            dout_stream = new DataOutputStream (out_stream);

            // Get a message from the client and output to the screen 

            System.out.print ("From the client -> ");
            while ((ch = (char) in_stream.read ()) != '\n')
            {
               System.out.print (ch);
            }
            System.out.println ();

            // Send back a response 

            System.out.println ("Sending the response");
            dout_stream.writeChars (msg);

            // Close the socket for this client.

            conn_sock.close ();
         } // end while

      } // end try
   
      catch (IOException e1)
      {
         System.err.println ("Error starting connection\n" + e1.toString());
         System.exit (1);
      } 
   
      // If somehow it terminates, clean up and say so.

      finally
      {
         System.out.println ();
         System.out.println ("Server terminates");
      }

   } // end main
} // end Server