diff --git a/examples/src/TcpExamples/TcpSentryScenarioDispatchServer.java b/examples/src/TcpExamples/TcpSentryScenarioDispatchServer.java index 134c6487496d16bec08974dd86c9837bd6b9b014..fa03640ded17192979ca8d94318aa6cddaac029a 100644 --- a/examples/src/TcpExamples/TcpSentryScenarioDispatchServer.java +++ b/examples/src/TcpExamples/TcpSentryScenarioDispatchServer.java @@ -8,10 +8,13 @@ import java.net.*; * 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 TcpSentryScenarioClient + * @see TcpSentryScenarioHandlerThread * @see TcpExample4Client + * @see TcpExample4DispatchServer * @see TcpExample4HandlerThread * - * @see <a href="../../../src/TcpExamples/TcpExample4TerminalLog.txt" target="blank">TcpExample4TerminalLog.txt</a> + * @see <a href="../../../src/TcpExamples/TcpSentryScenarioTerminalLog.txt" target="blank">TcpSentryScenarioTerminalLog.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> * @@ -21,6 +24,8 @@ import java.net.*; */ public class TcpSentryScenarioDispatchServer { + static String prefix = "[" + TcpSentryScenarioDispatchServer.class.getName() + "] "; + /** Default constructor */ public TcpSentryScenarioDispatchServer() { @@ -33,14 +38,15 @@ public class TcpSentryScenarioDispatchServer public static void main(String[] args) { try { - ServerSocket serverSocket = new ServerSocket(2317); - Socket clientConnectionSocket; - TcpExample4HandlerThread handlerThread; + ServerSocket serverSocket = new ServerSocket(2317); + Socket clientConnectionSocket; + TcpSentryScenarioHandlerThread handlerThread; int connectionCount = 0; // state variable - System.out.println(TcpSentryScenarioDispatchServer.class.getName() + " ready to accept socket connections..."); - while (true) // infinite loop + System.out.println(prefix + "waiting and ready to accept socket connection from client..."); + + while (true) // infinite loop, handling client connections and dispatching another handler thread { clientConnectionSocket = serverSocket.accept(); // block! until connected @@ -49,26 +55,27 @@ public class TcpSentryScenarioDispatchServer // TODO option for the student, 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 instead let our proxy thread - // TcpExample4HandlerThread introduce itself to the client. + // TcpSentryScenarioHandlerThread introduce itself to the client. System.out.println("============================================================="); - System.out.println(TcpSentryScenarioDispatchServer.class.getName() + ".handlerThread created for connection #" + connectionCount + "..."); + System.out.println(prefix + ".handlerThread created for connection #" + connectionCount + "..."); // hand off this aready-created and connected socket to constructor - handlerThread = new TcpExample4HandlerThread(clientConnectionSocket); + handlerThread = new TcpSentryScenarioHandlerThread(clientConnectionSocket); handlerThread.start();// invokes the run() method in that object - System.out.println(TcpSentryScenarioDispatchServer.class.getName() + ".handlerThread is now dispatched and running, using most recent connection..."); + System.out.println(prefix + ".handlerThread is now dispatched and running, using most recent connection..."); // while(true) continue looping, serverSocket is still waiting for another customer client } } catch (IOException e) { - System.out.println("Problem with " + TcpSentryScenarioDispatchServer.class.getName() + " networking:"); // describe what is happening + System.out.println("Problem with " + prefix + " 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.exit(-1); } System.out.println("============================================================="); // execution complete } diff --git a/examples/src/TcpExamples/TcpSentryScenarioHandlerThread.java b/examples/src/TcpExamples/TcpSentryScenarioHandlerThread.java index 968f057bbe808ce2c95d977514e325dd122d713c..37fe6051db9fe176cd42f0c52466d7d6e0449096 100644 --- a/examples/src/TcpExamples/TcpSentryScenarioHandlerThread.java +++ b/examples/src/TcpExamples/TcpSentryScenarioHandlerThread.java @@ -2,17 +2,19 @@ package TcpExamples; import java.io.*; import java.net.*; +import java.util.Arrays; +import java.util.List; /** * <p> - * This utility class supports the {@link TcpExample4DispatchServer} program, + * This utility class supports the {@link TcpSentryScenarioDispatchServer} program, * handling all programming logic needed for a new socket connection * to run in a thread of its own. This is the server * portion as well, so we artificially invent what happens * if the server can't respond to a connection for several seconds. * </p> * <p> - * Warning: do not run this class! It is created and used automatically by {@link TcpExample4DispatchServer} at run time. + * Warning: do not run this class! It is created and used automatically by {@link TcpSentryScenarioDispatchServer} at run time. * </p> * * @see TcpSentryScenarioClient @@ -21,7 +23,7 @@ import java.net.*; * @see TcpExample4DispatchServer * @see TcpExample4HandlerThread * - * @see <a href="../../../src/TcpExamples/TcpExample4TerminalLog.txt" target="blank">TcpExample4TerminalLog.txt</a> + * @see <a href="../../../src/TcpExamples/TcpSentryScenarioTerminalLog.txt" target="blank">TcpSentryScenarioTerminalLog.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> * @@ -31,6 +33,18 @@ import java.net.*; */ public class TcpSentryScenarioHandlerThread extends Thread { + /** Sentry Scenario access list + * See {@linktourl https://stackoverflow.com/questions/1005073/initialization-of-an-arraylist-in-one-line } + */ + public static List<String> allowedNamesList = + Arrays.asList("Tim", "Stephen", "Mark", "Rene", "Simon", "James", "Ethan", "Jin Hong"); + + public static final String HALT_WHO_GOES_THERE = "Halt who goes there?"; + public static final String YOU_MAY_PASS = "You may pass, have a great NPS MOVES day!"; + public static final String HOLD_IT_RIGHT_THERE = "You may not pass, leave immediately or else"; + + private static final String prefix = "[" + TcpSentryScenarioHandlerThread.class.getName() + "] "; + /** The socket connection to a client */ Socket socket; @@ -50,8 +64,8 @@ public class TcpSentryScenarioHandlerThread extends Thread */ public static void main(String[] args) { - System.out.println ("*** TcpExample4HandlerThread is not a standalone executable progam."); - System.out.println ("*** Please run TcpExample4DispatchServer instead... now exiting."); + System.out.println ("*** TcpSentryScenarioHandlerThread is not a standalone executable progam."); + System.out.println ("*** Please run TcpSentryScenarioDispatchServer instead... now exiting."); } /** Handles one connection. We add an artificial slowness @@ -64,26 +78,50 @@ public class TcpSentryScenarioHandlerThread extends Thread { try { - System.out.println(TcpSentryScenarioHandlerThread.class.getName() + " starting to handle a thread..."); + System.out.println(prefix + "starting to handle a thread..."); - // get the connection output stream, then wait a period of time. - OutputStream os = socket.getOutputStream(); - PrintStream ps = new PrintStream(os); + // input stream and output stream + InputStream inputStream = socket.getInputStream(); + Reader inputStreamReader = new InputStreamReader(inputStream); + BufferedReader bufferedReader = new BufferedReader(inputStreamReader); - final long TIMEOUT = 2000; // 2000 milliseconds = 2 seconds, 10000 milliseconds = 10 seconds - System.out.println(TcpSentryScenarioHandlerThread.class.getName() + " pausing for TIMEOUT=" + TIMEOUT + "ms" + - " to emulate computation and avoid server-side overload"); + OutputStream outputStream = socket.getOutputStream(); + PrintStream printStream = new PrintStream(outputStream); + + final long TIMEOUT = 100; // 2000 milliseconds = 2 seconds, 10000 milliseconds = 10 seconds +// System.out.println(prefix + " pausing for TIMEOUT=" + TIMEOUT + "ms" + +// " to emulate computation and avoid server-side overload"); Thread.sleep(TIMEOUT); // ps is the PrintStream is the Java way to use System.print() to pass data along the socket. - ps.println("This message was written by the server " + TcpSentryScenarioHandlerThread.class.getName()); // TODO insert socket count here! - ps.flush(); // make sure that it indeed escapes current process and reaches the client - socket.close(); // all clear, no longer need socket - System.out.println(TcpSentryScenarioHandlerThread.class.getName() + " finished handling a thread, now exit."); + printStream.println(prefix + "This message was written by the server "); // TODO insert socket count here! + printStream.flush(); // make sure that it indeed escapes current process and reaches the client + +//////////////////////////////////////////////////////////////////////////////////////////// +// Assignment code + + printStream.println(HALT_WHO_GOES_THERE); + System.out.println ("socket send: " + HALT_WHO_GOES_THERE); + + String clientResponse = bufferedReader.readLine(); + System.out.println ("clientResponse: " + clientResponse); + + if (clientResponse.equalsIgnoreCase("quit") || clientResponse.equalsIgnoreCase("exit")) + { + printStream.flush(); + socket.close(); + } + System.out.println ("Hello, " + clientResponse); + +//////////////////////////////////////////////////////////////////////////////////////////// + +//// socket.close(); // all clear, no longer need socket + System.out.println(prefix + "finished handling a thread, now exit."); + System.out.println("============================================================="); // execution complete } catch(IOException | InterruptedException e) // either a networking or a threading problem { - System.out.println("Problem with " + TcpSentryScenarioHandlerThread.class.getName() + " networking:"); // describe what is happening + System.out.println("Problem with " + prefix + " 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