import java.net.*;
import java.io.*;

public class TcpServer3 extends Thread {
  public final static int DEFAULT_PORT = 6789;
  private Socket client = null;
  
  public TcpServer3(Socket inSock) {
    super("echoServer");
    client = inSock;
  }

  public void run() {
    Socket cSock = client;PrintWriter writer;
    BufferedReader reader;
    try {
      String line;
      System.out.println ("Accepted from " + cSock.getInetAddress());
      reader = new BufferedReader(new
      InputStreamReader(cSock.getInputStream()));
      writer = new PrintWriter(new
      OutputStreamWriter(cSock.getOutputStream()));
      writer.println ("You are now connected to the Simple Echo Server.");
      writer.flush();
      for (;;) {
// read a line
        line = reader.readLine();
// and send back ACK
        writer.println("OK");
        writer.flush();
        System.out.println("Client says: " + line);
        if (line.equals("Server Exit") || line.equals("Client Exit")) break;
      }
      System.out.println ("Closing the client " + cSock.getInetAddress());
      reader.close();
      writer.close();
      cSock.close ();
      if (line.equals("Server Exit")) {
        System.out.println ("Closing the server");
// server.close ();
        System.exit(0);
      }
    } catch (IOException e1) {
      System.err.println("Exception: " + e1.getMessage());
      System.exit(1);
    }
  }
  
  public static void main (String args[]) {
    ServerSocket server = null;
    try {
      server = new ServerSocket(DEFAULT_PORT);
      System.out.println ("Starting on port " + DEFAULT_PORT);
    } catch (IOException e) {
      System.err.println("Exception: could't make server socket.");
      System.exit(1);
    }
    while (true) {
      Socket incomingSocket = null;
// wait fot a connection request
      System.out.println("Waiting...");
      try {
        incomingSocket = server.accept();
// call a thread to deal with a connection
        TcpServer3 es = new TcpServer3(incomingSocket);
        es.start();
      } catch (IOException e) {
        System.err.println("Exception: could't make server socket.");
        System.exit(1);
      }
    }
  }
}