From f044fd764452230fd5bd873e43f1363687af3bcd Mon Sep 17 00:00:00 2001 From: rojas <rojas@N619> Date: Sat, 17 Aug 2024 15:17:48 -0700 Subject: [PATCH] Update --- .../homework2/Romero/README.md | 8 +- .../homework2/Romero/RomeroClientHW2.java | 54 +++++--- .../Romero/RomeroHandlerThreadHW2.java | 116 ++++++++++++++++++ .../homework2/Romero/RomeroServerHW2.java | 92 +++++--------- .../Romero/TcpExample4HandlerThread.java | 89 -------------- .../homework2/Romero/images/MOTD.png | Bin 0 -> 13177 bytes 6 files changed, 184 insertions(+), 175 deletions(-) create mode 100644 assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/RomeroHandlerThreadHW2.java delete mode 100644 assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/TcpExample4HandlerThread.java create mode 100644 assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/images/MOTD.png diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/README.md b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/README.md index 2384842173..2ae29e8cb8 100644 --- a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/README.md +++ b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/README.md @@ -8,12 +8,12 @@ Modification to TCPExample4 to show the Message of the day (MOTD), depending on The server side sets up a server listening for incoming connectios. -When a client attempts a connection to the server it sends the day of the week for the current connection. +When a client attempts a connection to the server, it sends the day of the week for the current connection, based on the client's day. Once received the day of the week, the server reply with a message according to the day of the week. -Phrases taken from - -https://www.divein.com/everyday/monday-motivation-quotes/ +Phrases taken from: <b>https://www.divein.com/everyday/monday-motivation-quotes/</b> +<a href="images/MOTD.png"><img src="images/MOTD.png" width="700" align="center"/></a> +Message of the dayreference: <b>https://en.wikipedia.org/wiki/Message_of_the_day </b> diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/RomeroClientHW2.java b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/RomeroClientHW2.java index 9cc3217221..205fca1666 100644 --- a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/RomeroClientHW2.java +++ b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/RomeroClientHW2.java @@ -11,24 +11,16 @@ import java.time.DayOfWeek; * then checks how long it takes to read the single line it expects as a server response. * No fancy footwork here, it is pretty simple and similar to {@link TcpExample3Client}. * - * @see TcpExample4DispatchServer - * @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 RomeroClientHW2 { - /** Default constructor */ - public RomeroClientHW2() - { - // default constructor - } + /** + * Default constructor + */ + public RomeroClientHW2() { } /** * Program invocation, execution starts here @@ -36,12 +28,22 @@ public class RomeroClientHW2 */ public static void main(String[] args) { + /** + * Using DataInputStream and DataOutputStream to convert bytes from an + * input stream and converting then into Java's primitive data and vice versa + * respectively * + */ DataInputStream in; DataOutputStream out; + /** + * Getting the current date from the client, and getting the + * specific day of the week. + */ LocalDate currentDate = LocalDate.now(); DayOfWeek day = currentDate.getDayOfWeek(); - + + //Cheching the day of the week obtined System.out.println("Current date: " + currentDate); System.out.println("Today is: " + day + "\n"); @@ -49,15 +51,27 @@ public class RomeroClientHW2 try { Socket clientConnectionSocket = new Socket("localhost", 2317); - + + /** + * Creating a DataInputStream and DataOutputStream objects that reads data + * from the input stream of the socket connection and writes data through + * a socket connection, accordingly + */ in = new DataInputStream(clientConnectionSocket.getInputStream()); out = new DataOutputStream(clientConnectionSocket.getOutputStream()); - + + //Specifying the dar of the week, in string format out.writeUTF(day.name()); - - String mensaje = in.readUTF(); - - System.out.println(mensaje); + + /** + * Reading and printing strings from the server: + * message1 reads the number of client + * message2 reads the MOTD + */ + String message1 = in.readUTF(); + String message2 = in.readUTF(); + System.out.println(message1); + System.out.println(message2); clientConnectionSocket.close(); @@ -70,4 +84,4 @@ public class RomeroClientHW2 } } } -} +} \ No newline at end of file diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/RomeroHandlerThreadHW2.java b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/RomeroHandlerThreadHW2.java new file mode 100644 index 0000000000..dfbaa2e748 --- /dev/null +++ b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/RomeroHandlerThreadHW2.java @@ -0,0 +1,116 @@ +package MV3500Cohort2024JulySeptember.homework2.Romero; + +import java.io.*; +import java.net.*; + +/** + * <p> + * This utility class supports the {@link RomeroServerHW2} 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> + * + * @author Don Brutzman + * @author MV3500 class + * @author Rene + */ + +public class RomeroHandlerThreadHW2 extends Thread +{ + private final Socket clientConnectionSocket; + + /** + * The thread constructor creates the socket from a ServerSocket, waiting for the client to connect, + * and passes that socket when constructing the thread responsible for handling the connection. + * + * @param socket The socket connection handled by this thread + */ + + RomeroHandlerThreadHW2(Socket clientConnectionSocket) + { + this.clientConnectionSocket = clientConnectionSocket; + } + + /** + * Program invocation and execution starts here - but is illegal and unwanted, so warn the unsuspecting user! + * @param args command-line arguments + */ + public static void main(String[] args) + { + System.out.println ("*** Please run RomeroServerHW2 instead."); + } + + /** Handles one connection + * @overriding run() method in Java Thread class is deliberate + */ + @Override + public void run() + { + + /** + * Using DataInputStream and DataOutputStream to convert bytes from an + * input stream and converting then into Java's primitive data and vice versa + * respectively * + */ + DataInputStream in; + DataOutputStream out; + + try + { + + System.out.println(RomeroHandlerThreadHW2.class.getName() + " starting to handle a thread..."); + + /** + * Creating a DataInputStream and DataOutputStream objects that reads data + * from the input stream of the socket connection and writes data through + * a socket connection, accordingly + */ + in = new DataInputStream(clientConnectionSocket.getInputStream()); + out = new DataOutputStream(clientConnectionSocket.getOutputStream()); + + //Reading the day of the day from client + String messageFromClient = in.readUTF(); + + //Displaying in server side the day sended by the user + System.out.println("\nClient connected on: " + messageFromClient); + + /** + * Displaying a message of the day or welcome message when a user first connects + * to the server. The approach is the first step after creating the socket + * between client - server. + */ + String messageOTD = ""; + + switch(messageFromClient) { + case "MONDAY" -> messageOTD = "\n\"Mondays are the start of the work week which offer new beginnings 52 times a year!\"\n \t- David Dweck"; + case "TUESDAY" -> messageOTD = "\n\"May your Tuesday be like your coffee: strong, smooth, and full of warmth.\"\n \t- Unknown"; + case "WEDNESDAY" -> messageOTD = "\n\"Wednesdays will always bring smiles for the second half of the week.\"\n \t- Anthony T. Hincks"; + case "THURSDAY" -> messageOTD = "\n\"Thursday is a day to admit your mistakes and try to improve.\"\n \t- Byron Pulsifer"; + case "FRIDAY" -> messageOTD = "\n\"Every Friday, I like to high five myself for getting through another week\non little more than caffeine, willpower, and inappropriate humor.\"\n \t- Anonymous"; + case "SATURDAY" -> messageOTD = "\n\"Saturday is a time to enjoy the small things in life, and to look back on the week with gratitude.\"\n \t- Unknown"; + case "SUNDAY" -> messageOTD = "\n\"Sunday clears away the rust of the whole week.\"\n \t- Joseph Addison"; + default -> messageOTD = "\nError while getting the day of the week"; + } + + //Writing the MOTD to the client, according to its local day + out.writeUTF("\n**********************************************************************\n" + + messageOTD + + "\n\n**********************************************************************\n"); + + out.flush(); // make sure that it indeed escapes current process and reaches the client + clientConnectionSocket.close(); // all clear, no longer need socket + System.out.println(RomeroHandlerThreadHW2.class.getName() + " finished handling a thread, now exit."); + } + catch(IOException e) // either a networking or a threading problem + { + System.out.println("Problem with " + RomeroHandlerThreadHW2.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!"); + } + } +} \ No newline at end of file diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/RomeroServerHW2.java b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/RomeroServerHW2.java index 7242113e1d..d58d620e96 100644 --- a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/RomeroServerHW2.java +++ b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/RomeroServerHW2.java @@ -1,6 +1,5 @@ package MV3500Cohort2024JulySeptember.homework2.Romero; -import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.*; @@ -9,86 +8,55 @@ 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 + * @author Rene */ + public class RomeroServerHW2 { - /** Default constructor */ - public RomeroServerHW2() - { - // default constructor - } + /** + * Default constructor + */ + public RomeroServerHW2() { } + /** * Program invocation, execution starts here * @param args command-line arguments */ public static void main(String[] args) - { - DataInputStream in; - DataOutputStream out; - + { try { - ServerSocket serverSocket = new ServerSocket(2317); + ServerSocket serverSocket = new ServerSocket(2317); + System.out.println("\nServer has been initializated ... "); + System.out.println("\nWaiting for conections ...\n"); + + RomeroHandlerThreadHW2 handlerThread; + Socket clientConnectionSocket; - System.out.println("Server has been initializated ... "); - System.out.println("Witing for conections ..."); + //Counting the number of connections + int connectionCount = 0; - Socket clientConnectionSocket; - TcpExample4HandlerThread handlerThread; - - int connectionCount = 0; // state variable - - System.out.println(RomeroServerHW2.class.getName() + " ready to accept socket connections..."); - while (true) // infinite loop { clientConnectionSocket = serverSocket.accept(); // block! until connected - - connectionCount++; // unblocked, got another connection - - in = new DataInputStream(clientConnectionSocket.getInputStream()); - out = new DataOutputStream(clientConnectionSocket.getOutputStream()); - - String messageFromClient = in.readUTF(); - System.out.println("Client connected on: " + messageFromClient); - String messageOTD = ""; - - switch(messageFromClient) { - case "MONDAY" -> messageOTD = "\n\"Mondays are the start of the work week which offer new beginnings 52 times a year!\"\n \t- David Dweck"; - case "TUESDAY" -> messageOTD = "\n\"May your Tuesday be like your coffee: strong, smooth, and full of warmth.\"\n \t- Unknown"; - case "WEDNESDAY" -> messageOTD = "\n\"Wednesdays will always bring smiles for the second half of the week.\"\n \t- Anthony T. Hincks"; - case "THURSDAY" -> messageOTD = "\n\"Thursday is a day to admit your mistakes and try to improve.\"\n \t- Byron Pulsifer"; - case "FRIDAY" -> messageOTD = "\n\"Every Friday, I like to high five myself for getting through another week\non little more than caffeine, willpower, and inappropriate humor.\"\n \t- Anonymous"; - case "SATURDAY" -> messageOTD = "\n\"Saturday is a time to enjoy the small things in life, and to look back on the week with gratitude.\"\n \t- Unknown"; - case "SUNDAY" -> messageOTD = "\n\"Sunday clears away the rust of the whole week.\"\n \t- Joseph Addison"; - default -> messageOTD = "\nError while getting the day of the week"; - } - - out.writeUTF("\n**********************************************************************\n" - + messageOTD + - "\n\n**********************************************************************\n\n" - + "You are the client numer: " + connectionCount); - - System.out.println("============================================================="); - System.out.println(RomeroServerHW2.class.getName() + ".handlerThread created for connection #" + connectionCount + "..."); + connectionCount++; + + //printing clientConnectionSocket object + System.out.println(clientConnectionSocket); - // hand off this aready-created and connected socket to constructor - handlerThread = new TcpExample4HandlerThread(clientConnectionSocket); - handlerThread.start();// invokes the run() method in that object - System.out.println(RomeroServerHW2.class.getName() + ".handlerThread is now dispatched and running, using most recent connection..."); + //Sending to the user the client number, based on arrival + DataOutputStream outServer = new DataOutputStream(clientConnectionSocket.getOutputStream()); + outServer.writeUTF("\nYou are the client numer: " + connectionCount); - // while(true) continue looping, serverSocket is still waiting for another customer client + //Thread handler + handlerThread = new RomeroHandlerThreadHW2(clientConnectionSocket); + Thread thread = new Thread(handlerThread); + thread.start(); + + System.out.println(RomeroHandlerThreadHW2.class.getName() + ".handlerThread is launched, awaiting another connection..."); } } catch (IOException e) { @@ -101,4 +69,4 @@ public class RomeroServerHW2 } System.out.println("============================================================="); // execution complete } -} +} \ No newline at end of file diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/TcpExample4HandlerThread.java b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/TcpExample4HandlerThread.java deleted file mode 100644 index de26af4091..0000000000 --- a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/TcpExample4HandlerThread.java +++ /dev/null @@ -1,89 +0,0 @@ -package MV3500Cohort2024JulySeptember.homework2.Romero; - -import java.io.*; -import java.net.*; - -/** - * <p> - * This utility class supports the {@link RomeroServerHW2} 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. - * </p> - * - * - * @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 TcpExample4HandlerThread extends Thread -{ - /** The socket connection to a client */ - Socket socket; - - /** - * The thread constructor creates the socket from a ServerSocket, waiting for the client to connect, - * and passes that socket when constructing the thread responsible for handling the connection. - * - * @param socket The socket connection handled by this thread - */ - TcpExample4HandlerThread(Socket socket) - { - this.socket = socket; - } - /** - * Program invocation and execution starts here - but is illegal and unwanted, so warn the unsuspecting user! - * @param args command-line arguments - */ - 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."); - } - - /** Handles one connection. We add an artificial slowness - * to handling the connection with a sleep(). This means - * the client won't see a server connection response for ten seconds (default). - */ - // @overriding run() method in Java Thread class is deliberate - @Override - public void run() - { - try - { - System.out.println(TcpExample4HandlerThread.class.getName() + " 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); - - final long TIMEOUT = 2000; // 2000 milliseconds = 2 seconds, 10000 milliseconds = 10 seconds - System.out.println(TcpExample4HandlerThread.class.getName() + " 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 " + TcpExample4HandlerThread.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(TcpExample4HandlerThread.class.getName() + " finished handling a thread, now exit."); - } - catch(IOException | InterruptedException e) // either a networking or a threading problem - { - System.out.println("Problem with " + TcpExample4HandlerThread.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!"); - } - } -} diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/images/MOTD.png b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Romero/images/MOTD.png new file mode 100644 index 0000000000000000000000000000000000000000..d0784b97a259305b353d5bba14404e9786897531 GIT binary patch literal 13177 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�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 literal 0 HcmV?d00001 -- GitLab