/** * */ package ro.bmocanu.test.delayproxy; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketTimeoutException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; /** * * * @author mocanu */ public class Server extends Thread { private boolean threadShouldStop = false; private List<ServerWorker> serverWorkers = new ArrayList<ServerWorker>(); /** * @param port */ public Server() { this.serverWorkers = new ArrayList<ServerWorker>(); } /** * {@inheritDoc} */ @Override public void run() { try { ServerSocket serverSocket = new ServerSocket( Constants.LISTENING_PORT ); serverSocket.setSoTimeout( 1000 ); while ( !threadShouldStop ) { try { Socket clientSocket = serverSocket.accept(); System.out.println( "Accepted a new client request" ); ServerWorker worker = new ServerWorker( clientSocket ); serverWorkers.add( worker ); worker.start(); } catch ( SocketTimeoutException exception ) { // this is ok } TimeUnit.MILLISECONDS.sleep( 10 ); } } catch ( IOException exception ) { exception.printStackTrace(); } catch ( InterruptedException exception ) { exception.printStackTrace(); } for ( ServerWorker worker : serverWorkers ) { worker.managedStop(); } } public void managedStop() { System.out.println( "Shutting down the server" ); threadShouldStop = true; try { this.join(); } catch ( InterruptedException exception ) { exception.printStackTrace(); } } }