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

class TcpWorker extends Thread {

    Socket worksock;
    OutputStream outs;
    OutputStreamWriter outw;
    InputStream inss;
    InputStreamReader inpsr;
    BufferedReader ibrd;
    LineNumberReader lnr;
    boolean running;
    String cmdLine;

    public TcpWorker(Socket sock) {
	worksock = sock;
    }

    public void run() {
	try {
      	    outs = worksock.getOutputStream();
      	    inss = worksock.getInputStream();
      	    inpsr = new InputStreamReader(inss);
      	    ibrd = new BufferedReader(inpsr);
	    lnr = new LineNumberReader(ibrd);
      	    outw = new OutputStreamWriter(outs);
      	    System.out.println(Thread.currentThread().getName()+" - TcpWorker: "+
      			       "Local "+worksock.getLocalAddress()+
      			       " port "+worksock.getLocalPort()+
      			       " connected to "+worksock.getInetAddress()+
      			       " port "+worksock.getPort());
      	    //
      	    // prompt user
      	    //       
    	    outw.write("TcpServer running");
    	    outw.write('\r');
    	    outw.write('\n');
    	    outw.flush();
	    running = true;
	    while (running) {
		cmdLine = lnr.readLine().toUpperCase();
		outw.write("200 you entered: "+cmdLine);
    	    	outw.write('\r');
    	    	outw.write('\n');
    	    	outw.flush();
		if (cmdLine.startsWith("QUIT")) { running = false; }
	    }
            //
            // cleanup and close shop
	    //
    	    worksock.close();
    	    outw = null;
    	    outs = null;
    	    inss = null;
    	    ibrd = null;
	}
	catch (Exception e) { 
          System.out.println(Thread.currentThread().getName()+" - TcpWorker: "+
			     "Exception: "+e);
	}

    }

}
class tcpserver extends Thread {

    String serversocketname;
    ServerSocket listener;
    Socket wsock;
    TcpWorker worker;

    public tcpserver(String servsocknam) {
	serversocketname = servsocknam;
    }

    public void run() {
        try {
	    System.out.println(Thread.currentThread().getName()+
                               ": tcpserver at port "+serversocketname);
	    listener = new ServerSocket(Integer.parseInt(serversocketname));
            while (true) {
	      wsock = listener.accept();
	      worker = new TcpWorker(wsock);
	      worker.start();
	    }
	    
	}
	catch (Exception e) { System.out.println(e); }

    }
    public static void main(String[] args) {
	int socknamidx=0;
	tcpserver serv;
	try {
	    while (socknamidx<args.length) {
		serv = new tcpserver(args[socknamidx++]);
		serv.start();
	  }
       	while (true) { sleep(1000); }
	}
	catch (Exception e) { System.out.println(e); }
    }
}
