diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Lennon/LennonHW2Client.java b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Lennon/LennonHW2Client.java index 0b1f881a1032bf3d2a44c6f8cda1e23328e7b164..b86a6573b8da36872b620445d6e3cdf6d1217f3b 100644 --- a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Lennon/LennonHW2Client.java +++ b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Lennon/LennonHW2Client.java @@ -1,8 +1,8 @@ package MV3500Cohort2024JulySeptember.homework2.Lennon; -import TcpExamples.TcpExample3Client; -import TcpExamples.TcpExample4DispatchServer; -import TcpExamples.TcpExample4HandlerThread; +//import TcpExamples.TcpExample3Client; +//import TcpExamples.TcpExample4DispatchServer; +//import TcpExamples.TcpExample4HandlerThread; import java.io.*; import java.net.*; import java.util.Scanner; @@ -42,6 +42,7 @@ public class LennonHW2Client public static void main(String[] args) { try { boolean play; + Scanner scanner = new Scanner(System.in); System.out.println(LennonHW2Client.class.getName() + " start, loop " + MAX_LOOP_COUNT + " times"); System.out.println("======================================================="); //for (int loopCount = 1; loopCount <= MAX_LOOP_COUNT; loopCount++) // loop then exit @@ -52,13 +53,12 @@ public class LennonHW2Client // port number at that IP (2317). This establishes // a connection to that IP in the form of the Socket // object; the server uses a ServerSocket to wait for - // connections.This particualar example is interacting - // with what it expects is a server that writes a single text - // line after 10 sec. - long startTime = System.currentTimeMillis(); + // connections. + // open a socket for each loop Socket socket = new Socket(DESTINATION_HOST, 2317); + long startTime = System.currentTimeMillis(); // Setup. Read the single line written by the server. // We'd do things a bit differently if many lines to be read @@ -68,23 +68,49 @@ public class LennonHW2Client BufferedReader br = new BufferedReader(isr); String serverMessage = br.readLine(); // blocks - long readTime = System.currentTimeMillis(); - long timeLength = readTime - startTime; + System.out.println("Message from server:" + serverMessage); + String guess = null; + boolean validGuess = false; + while(!validGuess){ + guess = scanner.nextLine(); + try{ + int numGuess = Integer.parseInt(guess); + if (numGuess < 1 || numGuess > 10){ + System.out.println("I said between 1 and 10. Guess Again"); + continue; + } + validGuess = true; + } + catch(NumberFormatException e){ + System.out.println("That's not a number. Guess Again"); + } + } + OutputStream os = socket.getOutputStream(); + PrintStream ps = new PrintStream(os); + + ps.println(guess); + ps.flush(); + + is = socket.getInputStream(); + isr = new InputStreamReader(is); + br = new BufferedReader(isr); + + serverMessage = br.readLine(); // blocks + long endTime = System.currentTimeMillis(); + long timeLength = endTime - startTime; - System.out.println(LennonHW2Client.class.getName() + ": message received from server='" + serverMessage + "'"); - System.out.println(LennonHW2Client.class.getName() + ": time msec required for read=" + timeLength); - System.out.println("======================================================="); - // To push this further, launch multiple copies of TcpExample4Client simultaneously + System.out.println(": message received from server:" + serverMessage); + System.out.println(": time to play=" + timeLength); + System.out.println("Want to go again? Y/N"); - String response = ""; - //response = scanner.nextLine(); - if ("Y".equals(response.toUpperCase().charAt(0))){ - play = true; - } - else{ - play = false; - } + + String response = scanner.nextLine(); + play = "Y".equals(response.toUpperCase()); + //line below is for debug + System.out.println(response.toUpperCase()); //for debug only. delete later }while(play); + System.out.println("GOODBYE"); + System.out.println("======================================================="); System.out.println(LennonHW2Client.class.getName() + " complete"); // main method now exits } catch (IOException e) { diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Lennon/LennonHW2HandlerThread.java b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Lennon/LennonHW2HandlerThread.java index 6105573440f9c83e11ce535c1e9934112306466f..2bdad4bfc165dbc043cc2a4561bf4a259aee7315 100644 --- a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Lennon/LennonHW2HandlerThread.java +++ b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Lennon/LennonHW2HandlerThread.java @@ -1,7 +1,10 @@ package MV3500Cohort2024JulySeptember.homework2.Lennon; +import TcpExamples.TcpExample4Client; +import TcpExamples.TcpExample4DispatchServer; import java.io.*; import java.net.*; +import java.util.Random; /** * <p> @@ -64,16 +67,39 @@ public class LennonHW2HandlerThread extends Thread System.out.println(LennonHW2HandlerThread.class.getName() + " starting to handle a thread..."); // get the connection output stream, then wait a period of time. + Random random = new Random(); + int randNum = random.nextInt(10)+1; + OutputStream os = socket.getOutputStream(); PrintStream ps = new PrintStream(os); + + ps.println("I'm thinking of a number between 1 and 10. Can you guess it?" + LennonHW2HandlerThread.class.getName()); // TODO insert socket count here! + ps.flush(); // make sure that it indeed escapes current process and reaches the client + + InputStream is = socket.getInputStream(); + Reader isr = new InputStreamReader(is); + BufferedReader br = new BufferedReader(isr); + String userGuess = br.readLine(); // blocks + String serverResponse = null; + try{ + int userNum = Integer.parseInt(userGuess); + if (userNum == randNum){ + serverResponse = "Good job. You got it."; + }else{ + serverResponse = "You're wrong. It was " + randNum; + } + }catch(NumberFormatException e){ + System.out.println("Something went wrong. guess was not a number" + e); + serverResponse = "Something went wrong. Anyway, my number was " + randNum; + } final long TIMEOUT = 2000; // 2000 milliseconds = 2 seconds, 10000 milliseconds = 10 seconds System.out.println(LennonHW2HandlerThread.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 " + LennonHW2HandlerThread.class.getName()); // TODO insert socket count here! + ps.println(serverResponse + LennonHW2HandlerThread.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(LennonHW2HandlerThread.class.getName() + " finished handling a thread, now exit."); diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Williams/README.md b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Williams/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6989b20b1a73e709e3d7df177c7c2bbf5702d801 --- /dev/null +++ b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Williams/README.md @@ -0,0 +1,12 @@ +## Homework 2: + +For this assignment, I utilized the framework classes from the example 4 we disected in class. + +The three files—HW2Client, HW2Server, HW2Thread— work together to create a simple client-server application. +The server class is the main server program, listening for incoming client connections on a specified +port 2317. When the client connects, the server runs HW2Thread to handle the communication with that client, +allowing the server to manage multiple clients concurrently. The thread class is responsible for processing the client's +input and sending an appropriate response back, after which it closes the connection. On the client side, +the client class connects to the server, sends a message "Ethan", and receives a response. The client measures +the time taken for the interaction and handles multiple iterations if specified. Overall, the server/client interact +through a series of messages, with the server capable of handling multiple clients simultaneously through threading. \ No newline at end of file