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

class MultiLineServer extends Thread {
    private Socket sock;

    public MultiLineServer( Socket sock ) {
        this.sock = sock;
        start();
    }

    public void run() {
        try {
            /* data from client */
            BufferedReader rd  =
                new BufferedReader(
                    new InputStreamReader( sock.getInputStream() ));

            /* data to client */
            BufferedWriter bw = 
                new BufferedWriter( 
                    new OutputStreamWriter( sock.getOutputStream() ));

            String line = null;
            while ( (line=rd.readLine()) != null ) {
                line = line.toUpperCase();
                bw.write( line + "\n" );
                bw.flush();
                System.out.println( line );
            }
            System.out.println( "closing" + sock );
            sock.close(); // clean up required
            rd.close();
            bw.close();
        }
	catch( IOException e ) {
	    System.out.println("error: " + e );
	}
    }

    private static void dumpThreads() {
        Thread[] threads = new Thread[100];
        int num = Thread.enumerate( threads );
        for( int i = 0 ; i < num; i++ ) {
            System.out.println( threads[i] );
        }
    }

    public static void main( String[] args ) {
	try {
	    ServerSocket listen = new ServerSocket( 0 );
	    System.out.println("Server port is " + listen.getLocalPort() );

	    while ( true ) {
		Socket sock = listen.accept();
                new MultiLineServer( sock );
                dumpThreads();
	    }
	}
	catch( IOException e ) {
	    System.out.println("error: " + e );
	}
    }
}
