Moved functionality of getting ip and port from user from InputThread to main.

This commit is contained in:
WickedJack99
2024-04-04 22:11:50 +02:00
parent e3275d6485
commit aa5a71ac05
2 changed files with 130 additions and 116 deletions

View File

@@ -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() {

View File

@@ -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;
}
}