From aa5a71ac05c2a5845d920adddc177e3eeca564a8 Mon Sep 17 00:00:00 2001 From: WickedJack99 Date: Thu, 4 Apr 2024 22:11:50 +0200 Subject: [PATCH] Moved functionality of getting ip and port from user from InputThread to main. --- .../java/vslab1/src/Input/InputThread.java | 154 ++++++++---------- src/main/java/vslab1/src/Main.java | 92 ++++++++--- 2 files changed, 130 insertions(+), 116 deletions(-) diff --git a/src/main/java/vslab1/src/Input/InputThread.java b/src/main/java/vslab1/src/Input/InputThread.java index f8cb995..fb90772 100644 --- a/src/main/java/vslab1/src/Input/InputThread.java +++ b/src/main/java/vslab1/src/Input/InputThread.java @@ -5,14 +5,15 @@ package vslab1.src.Input; import vslab1.src.Terminatable; -import vslab1.src.Peers.Peer; import vslab1.src.Peers.PeerOrganizer; import vslab1.src.Sending.SendingQueue; -import vslab1.src.Sending.Data.PublishFileNameNotification; + import java.util.Scanner; public class InputThread extends Thread implements Terminatable { + private Scanner inputScanner = null; + private Terminatable receiverThread; private Terminatable senderThread; private Terminatable requestExecuterThread; @@ -23,10 +24,9 @@ public class InputThread extends Thread implements Terminatable { private boolean inputThreadRunning = true; - private boolean receivedValidIP = false; - private boolean receivedValidAndFreePort = false; - - public InputThread(Terminatable senderThread, Terminatable receiverThread, Terminatable requestExecuterThread, SendingQueue sendingQueue) { + public InputThread(Scanner inputScanner, Terminatable senderThread, Terminatable receiverThread, Terminatable requestExecuterThread, SendingQueue sendingQueue) { + this.inputScanner = inputScanner; + this.senderThread = senderThread; this.receiverThread = receiverThread; this.requestExecuterThread = requestExecuterThread; @@ -35,95 +35,71 @@ public class InputThread extends Thread implements Terminatable { @Override public void run() { - - String localIpAddress = null; - int localPort = -1; - - Scanner scanner = new Scanner(System.in); - while (!receivedValidIP) { - System.out.println("Enter ip:"); - - localIpAddress = scanner.nextLine(); - - receivedValidIP = NetworkController.hasNetworkInterfaceWithIP(localIpAddress); - } - - while (!receivedValidAndFreePort) { - System.out.println("Enter port:"); - - String localPortAsString = scanner.nextLine(); - - localPort = Integer.valueOf(localPortAsString); - - receivedValidAndFreePort = NetworkController.isPortFree(localPort); - } - + System.out.println("This peer is online and ready to take commands.\n"); while (inputThreadRunning) { - - System.out.println("This peer is online.\n"); + try { + System.out.println("Enter command:"); + String userInput = inputScanner.nextLine(); + String[] inputArgs = userInput.split(":"); + + if (inputArgs.length >= 1) { + String command = inputArgs[0]; - System.out.println("Enter command:"); + System.out.println(command); - String userInput = scanner.nextLine(); - - String[] inputArgs = userInput.split(":"); - - if (inputArgs.length >= 1) { - String command = inputArgs[0]; - - System.out.println(command); - - switch (command) { - case "exit": { - // Terminates sender thread, receiver thread and this thread. - if (senderThread != null) { - senderThread.terminate(); - } - if (receiverThread != null) { - receiverThread.terminate(); - } - if (requestExecuterThread != null) { - requestExecuterThread.terminate(); - } - this.terminate(); - }break; - case "ShowNodes": { - // TODO send onlineStateRequests to all peers in json file - // Start timeouts for all requests - // Update online states according to received, timeouted messages - }break; - case "ShowFiles": { - // Display own files information of jsons - }break; - case "PublishFile": { - if (inputArgs.length < 2) { - System.err.println("Too few arguments."); - } else if (inputArgs.length > 2) { - System.err.println("Too many arguments."); - } else { - // get list of online peers from json - // for each peer online send publish file name - //sendingQueue.add(new PublishFileNameNotification(peerOrganizer.getLocalPeer(), null, command)); - } - }break; - case "GetFile": { - if (inputArgs.length < 2) { - System.err.println("Too few arguments."); - } else if (inputArgs.length > 2) { - System.err.println("Too many arguments."); - } else { - // check which peer has file - // send get message to that peer - // if own file, just print - } - }break; - default: { - System.out.println("Unknown command."); - }break; + switch (command) { + case "exit": { + // Terminates sender thread, receiver thread and this thread. + if (senderThread != null) { + senderThread.terminate(); + } + if (receiverThread != null) { + receiverThread.terminate(); + } + if (requestExecuterThread != null) { + requestExecuterThread.terminate(); + } + this.terminate(); + }break; + case "ShowNodes": { + // TODO send onlineStateRequests to all peers in json file + // Start timeouts for all requests + // Update online states according to received, timeouted messages + }break; + case "ShowFiles": { + // Display own files information of jsons + }break; + case "PublishFile": { + if (inputArgs.length < 2) { + System.err.println("Too few arguments."); + } else if (inputArgs.length > 2) { + System.err.println("Too many arguments."); + } else { + // get list of online peers from json + // for each peer online send publish file name + //sendingQueue.add(new PublishFileNameNotification(peerOrganizer.getLocalPeer(), null, command)); + } + }break; + case "GetFile": { + if (inputArgs.length < 2) { + System.err.println("Too few arguments."); + } else if (inputArgs.length > 2) { + System.err.println("Too many arguments."); + } else { + // check which peer has file + // send get message to that peer + // if own file, just print + } + }break; + default: { + System.out.println("Unknown command."); + }break; + } } + } catch (Exception e) { + } } - scanner.close(); } public void terminate() { diff --git a/src/main/java/vslab1/src/Main.java b/src/main/java/vslab1/src/Main.java index 516d836..41f1542 100644 --- a/src/main/java/vslab1/src/Main.java +++ b/src/main/java/vslab1/src/Main.java @@ -5,8 +5,12 @@ package vslab1.src; import java.net.DatagramSocket; -import java.net.SocketException; + +import java.util.Scanner; + +import vslab1.src.FileReaderWriter.FileReaderWriter; import vslab1.src.Input.InputThread; +import vslab1.src.Input.NetworkController; import vslab1.src.Receiving.ReceiverThread; import vslab1.src.Receiving.ReceivingQueue; import vslab1.src.Request.RequestExecuterThread; @@ -15,34 +19,68 @@ import vslab1.src.Sending.SendingQueue; public class Main { public static void main(String[] args) { + Scanner inputScanner = new Scanner(System.in); + + FileReaderWriter.createInfoFilesIfNotExisting(Constants.PEERCONFIGFILEPATH); + + DatagramSocket datagramSocket = getSocket(inputScanner); + + SendingQueue sendingQueue = new SendingQueue(); + ReceivingQueue receivingQueue = new ReceivingQueue(); + + RequestExecuterThread requestExecuterThread = new RequestExecuterThread(sendingQueue, receivingQueue); + requestExecuterThread.start(); + ReceiverThread receiverThread = new ReceiverThread(datagramSocket, receivingQueue); + receiverThread.start(); + SenderThread senderThread = new SenderThread(datagramSocket, sendingQueue); + senderThread.start(); + InputThread inputThread = new InputThread(inputScanner, senderThread, receiverThread, requestExecuterThread, sendingQueue); + inputThread.start(); + try { - DatagramSocket datagramSocket = new DatagramSocket(5000); - - SendingQueue sendingQueue = new SendingQueue(); - ReceivingQueue receivingQueue = new ReceivingQueue(); - - RequestExecuterThread requestExecuterThread = new RequestExecuterThread(sendingQueue, receivingQueue); - requestExecuterThread.start(); - ReceiverThread receiverThread = new ReceiverThread(datagramSocket, receivingQueue); - receiverThread.start(); - SenderThread senderThread = new SenderThread(datagramSocket, sendingQueue); - senderThread.start(); - InputThread inputThread = new InputThread(senderThread, receiverThread, requestExecuterThread, sendingQueue); - inputThread.start(); - - try { - requestExecuterThread.join(); - receiverThread.join(); - senderThread.join(); - inputThread.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - datagramSocket.close(); - } catch (SocketException e) { - // TODO Auto-generated catch block + requestExecuterThread.join(); + receiverThread.join(); + senderThread.join(); + inputThread.join(); + } catch (InterruptedException e) { e.printStackTrace(); } + + datagramSocket.close(); + inputScanner.close(); + } + + /** + * Asks user to enter ip and port until those are valid and applicable and creates a DatagramSocket with given values. + * @return a DatagramSocket with ip and port specified by user input. + */ + public static DatagramSocket getSocket(Scanner inputScanner) { + DatagramSocket datagramSocket = null; + boolean receivedValidIP = false; + boolean receivedValidAndFreePort = false; + String localIpAddress = null; + int localPort = -1; + // User has to enter a valid ip. + while (!receivedValidIP) { + System.out.println("Enter ip:"); + localIpAddress = inputScanner.nextLine(); + receivedValidIP = NetworkController.hasNetworkInterfaceWithIP(localIpAddress); + if (!receivedValidIP) { + System.err.println("Error: IP is not valid for this system. Please re-enter."); + } + } + // User has to enter a valid port. + while (!receivedValidAndFreePort) { + System.out.println("Enter port:"); + String localPortAsString = inputScanner.nextLine(); + localPort = Integer.valueOf(localPortAsString); + datagramSocket = NetworkController.tryBindToPort(localIpAddress, localPort); + if (datagramSocket == null) { + System.err.println("Error: Port is not available for this ip. Please re-enter."); + } else { + receivedValidAndFreePort = true; + } + } + return datagramSocket; } } \ No newline at end of file