diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Client_HW2.java b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Client_HW2.java index 7eb81b34a1c8e0c845047514f151377197cd86cc..806d4bee9ad3e4f909819bf3d1a87053f755be23 100644 --- a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Client_HW2.java +++ b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Client_HW2.java @@ -1,42 +1,58 @@ package MV3500Cohort2024JulySeptember.homework2.Timberlake; -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetAddress; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.Socket; import java.util.Scanner; +import java.io.PrintWriter; /** * * @author Jack */ + + public class Client_HW2 { public static void main(String[] args) { - DatagramSocket socket = null; + Socket socket = null; Scanner scanner = new Scanner(System.in); try { // Create a socket to communicate with the server - socket = new DatagramSocket(); - InetAddress serverAddress = InetAddress.getByName("localhost"); // Server address (localhost for testing) - byte[] sendData = new byte[1024]; // Buffer to store data to send - byte[] receiveData = new byte[1024]; // Buffer to store received data + socket = new Socket("192.168.56.1", 9876); // change IP depending on server machine + + PrintWriter outputWriter = new PrintWriter(socket.getOutputStream(), true); + BufferedReader inputReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); + + // Receive and display server messages + System.out.println(inputReader.readLine()); // Enter name + String name = scanner.nextLine(); + outputWriter.println(name); // Send name + outputWriter.flush(); - System.out.print("Let's play a game!!\n"); - System.out.print("Try guessing a number between 1-100\n"); + System.out.println(inputReader.readLine()); // Enter fav color + String color = scanner.nextLine(); + outputWriter.println(color); // Send fav color + outputWriter.flush(); + + // Receive and display initial messages from the server + // Empty string means init messages over + String serverMessage; + while (!(serverMessage = inputReader.readLine()).isEmpty()) { + System.out.println(serverMessage); + } + while(true) { System.out.print("Enter your guess: "); String guess = scanner.nextLine(); //Read user input - sendData = guess.getBytes(); // Convert message to bytes + outputWriter.println(guess); //Send guess to server + outputWriter.flush(); - // Send guess to the server - DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, 9876); - socket.send(sendPacket); // Send packet to server - // Receive response from server - DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); - socket.receive(receivePacket); // Blocking call until a packet is received - String response = new String(receivePacket.getData(), 0, receivePacket.getLength()); - System.out.println("Server Said: " + response); // Print received response + String response = inputReader.readLine(); + System.out.println("Server Said: " + response); // print server response + // End game if (response.startsWith ("Good")) { break; //End the game } @@ -49,7 +65,11 @@ public class Client_HW2 { scanner.close(); // Close scanner } if (socket != null && !socket.isClosed()) { - socket.close(); // Close the socket to release resources + try { + socket.close(); // Close the socket to release resources + } catch (Exception e) { + e.printStackTrace(); + } } } } diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/GameHandler.java b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/GameHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..9403aa23e5602254321633278d8e3ceb1a6dca8f --- /dev/null +++ b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/GameHandler.java @@ -0,0 +1,102 @@ +package MV3500Cohort2024JulySeptember.homework2.Timberlake; + +/** + * + * @author Jack + */ + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.Socket; +import java.util.Random; +import java.util.HashMap; +import java.util.Map; + +public class GameHandler implements Runnable { + private Socket clientSocket; + private int numToGuess; + private static final Map<String, String> userCredentials = new HashMap<>(); + + static { + // User credentials dictionary + userCredentials.put("Jack", "blue"); + userCredentials.put("Stephen", "green"); + userCredentials.put("Don", "red"); + + } + + public GameHandler(Socket clientSocket) { + this.clientSocket = clientSocket; + Random random = new Random(); + this.numToGuess = random.nextInt(100) + 1; // Initialize random number 1-100 + } + + @Override + public void run() { + try (BufferedReader inputReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + PrintWriter outputWriter = new PrintWriter(clientSocket.getOutputStream(), true)) { + + // Request name from client + outputWriter.println("Enter your name:"); + outputWriter.flush(); + String name = inputReader.readLine(); + + // Request favorite color from client + outputWriter.println("Enter your favorite color:"); + outputWriter.flush(); + String color = inputReader.readLine(); + + // Check credentials and start game + // Kill connection if credentials are wrong + if (!(userCredentials.containsKey(name) && userCredentials.get(name).equalsIgnoreCase(color))) { + outputWriter.println("INTRUDER! INTRUDER! TERMINATING CONNECTION."); + clientSocket.close(); + } else { + outputWriter.println("Authentication successful! Welcome, " + name + "."); + outputWriter.println("Let's play a game!!"); + outputWriter.println("Try guessing a number between 1-100"); + outputWriter.println(""); // Send an empty line to signal the end of initial messages + } + + int count = 1; + boolean isRunning = true; + + while (isRunning) { + // Read message from client + String message = inputReader.readLine(); + System.out.println("Client sent: " + message); // Print received message + + String response; + try { + int guess = Integer.parseInt(message.trim()); + if (guess < numToGuess) { + response = "Guess Higher"; + count++; + } else if (guess > numToGuess) { + response = "Guess Lower"; + count++; + } else { + response = "Good Job " + name + "!! That took you " + count + " tries!"; + isRunning = false; + } + } catch (NumberFormatException e) { + response = "Invalid input. Enter a number."; + } + + // Send response to client + outputWriter.println(response); + } + } catch (Exception e) { + e.printStackTrace(); // Print any exceptions that occur + } finally { + try { + if (clientSocket != null && !clientSocket.isClosed()) { + clientSocket.close(); // Close the client socket to release resources + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Server_HW2.java b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Server_HW2.java index 3d9df86269f2a5b72d39e8845dc6522508f1d80c..987e79ec35af26cddb82cc8c5b53a889101993a3 100644 --- a/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Server_HW2.java +++ b/assignments/src/MV3500Cohort2024JulySeptember/homework2/Timberlake/Server_HW2.java @@ -1,69 +1,44 @@ package MV3500Cohort2024JulySeptember.homework2.Timberlake; -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetAddress; -import java.util.Random; +import java.net.ServerSocket; +import java.net.Socket; /** * * @author Jack */ + + public class Server_HW2 { public static void main(String[] args) { - DatagramSocket socket = null; - Random random = new Random(); - int numToGuess = random.nextInt(100) + 1; - //System.out.println("Magic Number Is: " + numToGuess); + ServerSocket serverSocket = null; try { // Create a socket to listen on port 9876 - socket = new DatagramSocket(9876); - byte[] receiveData = new byte[1024]; // Buffer to store incoming data - byte[] sendData = new byte[1024]; // Buffer to store outgoing data - int count = 1; + serverSocket = new ServerSocket(9876); System.out.println("Server has started, waiting for client..."); + + while (true) { + // Accept client connection + Socket clientSocket = serverSocket.accept(); + System.out.println("Client connected"); - boolean isRunning = true; - while (isRunning) { - // Receive packet from client - DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); - socket.receive(receivePacket); // Blocking call until a packet is received - - String message = new String(receivePacket.getData(), 0, receivePacket.getLength()); //Receive packet - InetAddress clientAddress = receivePacket.getAddress(); //Save IP for response - int clientPort = receivePacket.getPort(); //Save port for response - - System.out.println("Client sent: " + message); // Print received message + // Create GameHandler to handle client + GameHandler gameHandler = new GameHandler(clientSocket); - String response; - try { - int guess = Integer.parseInt(message.trim()); - if (guess < numToGuess) { - response = "Guess Higher"; - count++; - } else if (guess > numToGuess) { - response = "Guess Lower"; - count++; - } else { - response = "Good Job!! That took you " + count + " tries!"; - isRunning = false; - } - } catch (NumberFormatException e) { - response = "Invalid input. Enter a number."; - } - - // Prepare response to client - sendData = response.getBytes(); // Convert response message to bytes - DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort); - socket.send(sendPacket); // Send response packet to client - + // Create new thread to handle the game + Thread thread = new Thread(gameHandler); + thread.start(); } } catch (Exception e) { e.printStackTrace(); // Print any exceptions that occur } finally { - if (socket != null && !socket.isClosed()) { - socket.close(); // Close the socket to release resources + try { + if (serverSocket != null && !serverSocket.isClosed()) { + serverSocket.close(); // Close the server socket to release resources + } + } catch (Exception e) { + e.printStackTrace(); } } }