Skip to content
Snippets Groups Projects
Commit 1ce8fc35 authored by Brutzman, Don's avatar Brutzman, Don
Browse files

work in progress, updates continuing

parent adf33ded
No related branches found
No related tags found
No related merge requests found
......@@ -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
}
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment