package TcpExamples; import java.io.IOException; import java.net.*; /** * This server program works a bit differently by creating and dispatching a * new thread to handle multiple incoming socket connections, one after another, all running in parallel. * This advanced technique is often used in high=performance high=capacity server programs. * * @see TcpExample4Client * @see TcpExample4HandlerThread * * @see <a href="../../../src/TcpExamples/TcpExample4TerminalLog.txt" target="blank">TcpExample4TerminalLog.txt</a> * @see <a href="../../../src/TcpExamples/TcpExample4SequenceDiagram.png" target="blank">TcpExample4SequenceDiagram.png</a> * @see <a href="../../../src/TcpExamples/TcpExample4SequenceSketch.png" target="blank">TcpExample4SequenceSketch.png</a> * * @author Don McGregor * @author Don Brutzman * @author MV3500 class */ public class TcpExample4DispatchServer { /** Default constructor */ public TcpExample4DispatchServer() { // default constructor } /** * Program invocation, execution starts here * @param args command-line arguments */ public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(2317); TcpExample4HandlerThread handlerThread; Socket clientConnection; int connectionCount = 0; // state variable System.out.println(TcpExample4DispatchServer.class.getName() + " ready to accept socket connections..."); while (true) // infinite loop { clientConnection = serverSocket.accept(); // block! until connected connectionCount++; // unblocked, got another connection // TODO provide initial message *to the client* that we are handing off to a dispatch thread... because that is polite behavior. // plenty of code in Example3, we will let TcpExample4HandlerThread introduce itself System.out.println("============================================================="); System.out.println(TcpExample4DispatchServer.class.getName() + ".handlerThread created for connection #" + connectionCount + "..."); handlerThread = new TcpExample4HandlerThread(clientConnection); // hand off the aready-created, connected socket to constructor handlerThread.start();// invokes the run() method in that object System.out.println(TcpExample4DispatchServer.class.getName() + ".handlerThread is now dispatched and running, using most recent connection..."); } } catch (IOException e) { System.out.println("Problem with " + TcpExample4DispatchServer.class.getName() + " networking:"); // describe what is happening System.out.println("Error: " + e); // Provide more helpful information to user if exception occurs due to running twice at one time if (e instanceof java.net.BindException) { System.out.println("*** Be sure to stop any other running instances of programs using this port!"); } } System.out.println("============================================================="); } }