import java.net.*;
import java.io.*;

public class TCPServer implements Cloneable, Runnable {
	Thread runner = null;
	ServerSocket server = null;
	Socket data = null;
	volatile boolean shouldStop = false;
	
	public synchronized void startServer(int port) throws IOException {
		if (runner == null) {
			server = new ServerSocket(port);
			runner = new Thread(this);
			runner.start();
		} //if
	} //startServer()
	
	public synchronized void stopServer() {
		if (server != null) {
			shouldStop = true;
			runner.interrupt();
			runner = null;
			try {
				server.close();
			} catch (IOException ioe) {}
			server = null;
		} //if
	} //stopServer()
	
	public void run() {
		if (server != null) {
			while (!shouldStop) {
				try {
					Socket datasocket = server.accept();
					TCPServer newSocket = (TCPServer) clone();
					
					newSocket.server = null;
					newSocket.data = datasocket;
					newSocket.runner = new Thread(newSocket);
					newSocket.runner.start();
				} catch (Exception e) {}
			} //while
		} else {
			run(data);
		} //if
	} //run()
	
	public void run(Socket data) {
		InputStream in = null;
		InputStreamReader isr = null;
		try {			
			in = data.getInputStream();
			isr = new InputStreamReader(in);
	
			int c; 
			while ( (c = isr.read()) != -1 ) {
				System.out.println("("+data.getLocalPort()+"/"+Thread.currentThread().getName()+") " + (char) c);
			} //while
		} catch (IOException io) {
			System.out.println("an IOException occurred\n"+io.toString()+"\n"+io.getMessage() );
		} //catch
	} //run()
} //class TCPServer
