/** * */ package ro.bmocanu.test.delayproxy; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.concurrent.TimeUnit; /** * * * @author mocanu */ public class ServerWorker extends Thread { private boolean threadShouldStop = false;; private Socket clientSocket; private ServerWorkerTransferrer clientTransf; private ServerWorkerTransferrer remoteTransf; /** * @param clientSocket */ public ServerWorker(Socket clientSocket) { super(); this.clientSocket = clientSocket; } /** * {@inheritDoc} */ @Override public void run() { System.out.println( "Worker " + getId() + ": Starting the communication" ); try { Socket remoteSocket = new Socket( Constants.REMOTE_HOST, Constants.REMOTE_PORT ); InputStream remoteSocketIS = remoteSocket.getInputStream(); OutputStream remoteSocketOS = remoteSocket.getOutputStream(); InputStream clientSocketIS = clientSocket.getInputStream(); OutputStream clientSocketOS = clientSocket.getOutputStream(); if ( Constants.START_DELAY > 0 ) { System.out.println( "Worker " + getId() + ": Start delay" ); TimeUnit.MILLISECONDS.sleep( Constants.START_DELAY ); } clientTransf = new ServerWorkerTransferrer( "local", clientSocket, clientSocketIS, remoteSocketOS ); clientTransf.start(); remoteTransf = new ServerWorkerTransferrer( "remote", remoteSocket, remoteSocketIS, clientSocketOS ); remoteTransf.start(); while ( !threadShouldStop && (!clientTransf.isFinished() || !remoteTransf.isFinished()) ) { TimeUnit.MILLISECONDS.sleep( 50 ); } System.out.println( "Worker " + getId() + ": Communication is finished" ); clientSocket.close(); remoteSocket.close(); clientTransf.managedStop(); remoteTransf.managedStop(); } catch ( IOException exception ) { exception.printStackTrace(); } catch ( InterruptedException exception ) { exception.printStackTrace(); } } public void managedStop() { System.out.println( "Worker " + getId() + ": Shutting down the worker" ); threadShouldStop = true; try { this.join(); } catch ( InterruptedException exception ) { exception.printStackTrace(); } } }