From 04997a0d16528b6bfa20224c39f7202752beda51 Mon Sep 17 00:00:00 2001 From: Oigul Date: Sat, 4 Jul 2020 20:53:50 +0300 Subject: [PATCH] Java-lab-6 --- .idea/.gitignore | 2 + .idea/Java-lab-6.iml | 9 ++ .idea/compiler.xml | 13 ++ .idea/lab6.iml | 2 + .idea/misc.xml | 14 ++ .idea/modules.xml | 8 ++ .idea/uiDesigner.xml | 124 ++++++++++++++++++ .idea/vcs.xml | 6 + lab6.iml | 2 + pom.xml | 59 +++++++++ src/main/java/task1/client/Client.java | 24 ++++ src/main/java/task1/client/ui/Controller.java | 21 +++ .../java/task1/client/ui/DigitalClock.java | 68 ++++++++++ src/main/java/task1/client/ui/MainApp.java | 24 ++++ src/main/java/task1/server/Server.java | 38 ++++++ .../java/task2/client/AphorismsClient.java | 22 ++++ .../java/task2/server/AphorismSender.java | 63 +++++++++ .../java/task2/server/AphorismsServer.java | 32 +++++ src/main/java/task2/server/ClientHolder.java | 22 ++++ src/main/java/task3/Event.java | 37 ++++++ src/main/java/task3/client/EventsClient.java | 27 ++++ src/main/java/task3/server/ClientHolder.java | 28 ++++ src/main/java/task3/server/EventsSender.java | 52 ++++++++ src/main/java/task3/server/EventsServer.java | 33 +++++ src/main/java/task4/CurrencyExchange.java | 37 ++++++ .../java/task4/client/CurrencyClient.java | 34 +++++ src/main/java/task4/server/CurrencyRates.java | 30 +++++ .../java/task4/server/CurrencyServer.java | 45 +++++++ src/main/resources/task1/fxml/app.fxml | 13 ++ src/main/resources/task2/aphorisms.json | 10 ++ target/classes/META-INF/lab6.kotlin_module | Bin 0 -> 16 bytes target/classes/task1/client/Client.class | Bin 0 -> 2244 bytes .../classes/task1/client/ui/Controller.class | Bin 0 -> 781 bytes .../task1/client/ui/DigitalClock.class | Bin 0 -> 3506 bytes target/classes/task1/client/ui/MainApp.class | Bin 0 -> 1362 bytes target/classes/task1/fxml/app.fxml | 13 ++ target/classes/task1/server/Server.class | Bin 0 -> 2423 bytes target/classes/task2/aphorisms.json | 10 ++ .../task2/client/AphorismsClient.class | Bin 0 -> 2070 bytes .../task2/server/AphorismSender$1.class | Bin 0 -> 675 bytes .../classes/task2/server/AphorismSender.class | Bin 0 -> 3005 bytes .../task2/server/AphorismsServer.class | Bin 0 -> 1604 bytes .../classes/task2/server/ClientHolder.class | Bin 0 -> 827 bytes target/classes/task3/Event.class | Bin 0 -> 1346 bytes .../classes/task3/client/EventsClient.class | Bin 0 -> 2304 bytes .../classes/task3/server/ClientHolder.class | Bin 0 -> 968 bytes .../classes/task3/server/EventsSender.class | Bin 0 -> 2876 bytes .../classes/task3/server/EventsServer.class | Bin 0 -> 2069 bytes target/classes/task4/CurrencyExchange.class | Bin 0 -> 1113 bytes .../classes/task4/client/CurrencyClient.class | Bin 0 -> 2816 bytes .../classes/task4/server/CurrencyRates.class | Bin 0 -> 1467 bytes .../classes/task4/server/CurrencyServer.class | Bin 0 -> 3233 bytes target/lab6-1.0-SNAPSHOT.jar | Bin 0 -> 8447 bytes target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 5 + .../compile/default-compile/inputFiles.lst | 5 + .../default-testCompile/inputFiles.lst | 0 57 files changed, 937 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/Java-lab-6.iml create mode 100644 .idea/compiler.xml create mode 100644 .idea/lab6.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 lab6.iml create mode 100644 pom.xml create mode 100644 src/main/java/task1/client/Client.java create mode 100644 src/main/java/task1/client/ui/Controller.java create mode 100644 src/main/java/task1/client/ui/DigitalClock.java create mode 100644 src/main/java/task1/client/ui/MainApp.java create mode 100644 src/main/java/task1/server/Server.java create mode 100644 src/main/java/task2/client/AphorismsClient.java create mode 100644 src/main/java/task2/server/AphorismSender.java create mode 100644 src/main/java/task2/server/AphorismsServer.java create mode 100644 src/main/java/task2/server/ClientHolder.java create mode 100644 src/main/java/task3/Event.java create mode 100644 src/main/java/task3/client/EventsClient.java create mode 100644 src/main/java/task3/server/ClientHolder.java create mode 100644 src/main/java/task3/server/EventsSender.java create mode 100644 src/main/java/task3/server/EventsServer.java create mode 100644 src/main/java/task4/CurrencyExchange.java create mode 100644 src/main/java/task4/client/CurrencyClient.java create mode 100644 src/main/java/task4/server/CurrencyRates.java create mode 100644 src/main/java/task4/server/CurrencyServer.java create mode 100644 src/main/resources/task1/fxml/app.fxml create mode 100644 src/main/resources/task2/aphorisms.json create mode 100644 target/classes/META-INF/lab6.kotlin_module create mode 100644 target/classes/task1/client/Client.class create mode 100644 target/classes/task1/client/ui/Controller.class create mode 100644 target/classes/task1/client/ui/DigitalClock.class create mode 100644 target/classes/task1/client/ui/MainApp.class create mode 100644 target/classes/task1/fxml/app.fxml create mode 100644 target/classes/task1/server/Server.class create mode 100644 target/classes/task2/aphorisms.json create mode 100644 target/classes/task2/client/AphorismsClient.class create mode 100644 target/classes/task2/server/AphorismSender$1.class create mode 100644 target/classes/task2/server/AphorismSender.class create mode 100644 target/classes/task2/server/AphorismsServer.class create mode 100644 target/classes/task2/server/ClientHolder.class create mode 100644 target/classes/task3/Event.class create mode 100644 target/classes/task3/client/EventsClient.class create mode 100644 target/classes/task3/server/ClientHolder.class create mode 100644 target/classes/task3/server/EventsSender.class create mode 100644 target/classes/task3/server/EventsServer.class create mode 100644 target/classes/task4/CurrencyExchange.class create mode 100644 target/classes/task4/client/CurrencyClient.class create mode 100644 target/classes/task4/server/CurrencyRates.class create mode 100644 target/classes/task4/server/CurrencyServer.class create mode 100644 target/lab6-1.0-SNAPSHOT.jar create mode 100644 target/maven-archiver/pom.properties create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..e7e9d11 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml diff --git a/.idea/Java-lab-6.iml b/.idea/Java-lab-6.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/Java-lab-6.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..bdaa776 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/lab6.iml b/.idea/lab6.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/.idea/lab6.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0b7810f --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..07e6150 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lab6.iml b/lab6.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/lab6.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..6833a1a --- /dev/null +++ b/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + + org.example + lab6 + 1.0-SNAPSHOT + + + + + org.openjfx + javafx-maven-plugin + 0.0.4 + + task1.client.ui.MainApp + + + + org.apache.maven.plugins + maven-compiler-plugin + + 13 + 13 + + + + + + + + + + org.openjfx + javafx-controls + 14 + + + org.openjfx + javafx-fxml + 15-ea+6 + + + + com.fasterxml.jackson.core + jackson-databind + 2.11.0 + + + org.apache.commons + commons-lang3 + 3.10 + + + + + \ No newline at end of file diff --git a/src/main/java/task1/client/Client.java b/src/main/java/task1/client/Client.java new file mode 100644 index 0000000..54ec72e --- /dev/null +++ b/src/main/java/task1/client/Client.java @@ -0,0 +1,24 @@ +package task1.client; + +import java.io.*; +import java.net.Socket; +import java.util.Date; + +public class Client { + + public Date getDateFromServer() { + String date = ""; + try (Socket socket = new Socket("localhost", 8080); + OutputStream output = socket.getOutputStream(); + PrintWriter writer = new PrintWriter(output, true); + InputStream input = socket.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(input))) { + System.out.println(); + writer.println("getDate"); + date = reader.readLine(); + } catch (IOException e) { + e.printStackTrace(); + } + return new Date(Long.parseLong(date)); + } +} diff --git a/src/main/java/task1/client/ui/Controller.java b/src/main/java/task1/client/ui/Controller.java new file mode 100644 index 0000000..bb574ef --- /dev/null +++ b/src/main/java/task1/client/ui/Controller.java @@ -0,0 +1,21 @@ +package task1.client.ui; + +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import task1.client.Client; + +public class Controller { + + @FXML + private DigitalClock digitalClock; + + @FXML + private Button button; + + private Client client = new Client(); + + + public void click() { + digitalClock.setTime(client.getDateFromServer()); + } +} diff --git a/src/main/java/task1/client/ui/DigitalClock.java b/src/main/java/task1/client/ui/DigitalClock.java new file mode 100644 index 0000000..a570065 --- /dev/null +++ b/src/main/java/task1/client/ui/DigitalClock.java @@ -0,0 +1,68 @@ +package task1.client.ui; + +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.scene.canvas.Canvas; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.layout.StackPane; +import javafx.scene.paint.Color; +import javafx.scene.text.Font; +import javafx.scene.text.FontWeight; +import javafx.scene.text.Text; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +public class DigitalClock extends StackPane { + + private Canvas canvas = new Canvas(); + + private GraphicsContext gc = canvas.getGraphicsContext2D(); + + private Text text = new Text(""); + + private StringProperty timeNow = new SimpleStringProperty(); + + public DigitalClock() { + this.setWidth(100); + this.setHeight(50); + canvas.setWidth(this.getWidth()); + canvas.setHeight(this.getHeight()); + text.setFill(Color.WHITE); + text.setFont(Font.font("null", FontWeight.BOLD, 15)); + timeNow.setValue("00:00:00"); + text.textProperty().bind(timeNow); + + getChildren().addAll(canvas, text); + + paintClock(); + } + + public void setTime(Date date) { + Calendar calendar = GregorianCalendar.getInstance(); + calendar.setTime(date); + //Здесь дописать дату через calendar.get + timeNow.setValue(zero(calendar.get(Calendar.HOUR)) + ":" + zero(calendar.get(Calendar.MINUTE)) + ":" + zero(calendar.get(Calendar.SECOND)) + ":" + zero(calendar.get(Calendar.YEAR))); + } + + private void paintClock() { + gc.clearRect(0, 0, getWidth(), getHeight()); + + gc.setFill(Color.FIREBRICK); + gc.fillRoundRect(0, 0, getWidth(), getHeight(), 25, 25); + } + + private String zero(int number) { + return (number < 10) ? "0" + number : "" + number; + } + + public void setHeight(double height) { + super.setHeight(height); + } + + public void setWidth(double width) { + super.setWidth(width); + } + +} \ No newline at end of file diff --git a/src/main/java/task1/client/ui/MainApp.java b/src/main/java/task1/client/ui/MainApp.java new file mode 100644 index 0000000..8165e54 --- /dev/null +++ b/src/main/java/task1/client/ui/MainApp.java @@ -0,0 +1,24 @@ +package task1.client.ui; + +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; + +public class MainApp extends Application { + + public static void main(String[] args) { + launch(args); + } + + @Override + public void start(Stage stage) throws Exception { + String fxmlFile = "/task1/fxml/app.fxml"; + FXMLLoader loader = new FXMLLoader(); + AnchorPane root = loader.load(getClass().getResourceAsStream(fxmlFile)); + stage.setTitle("Lab6. Task 1"); + stage.setScene(new Scene(root)); + stage.show(); + } +} diff --git a/src/main/java/task1/server/Server.java b/src/main/java/task1/server/Server.java new file mode 100644 index 0000000..bcd1958 --- /dev/null +++ b/src/main/java/task1/server/Server.java @@ -0,0 +1,38 @@ +package task1.server; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.Date; + +public class Server { + + public static void main(String[] args) { + startServer(); + } + + public static void startServer() { + try (ServerSocket serverSocket = new ServerSocket(8080)) { + while (true) { + Socket clientSocket = serverSocket.accept(); + System.out.println("New client connected"); + PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); + BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + + String text = in.readLine(); + if(!"getDate".equals(text)){ + System.out.println("Unknown message from client"); + continue; + } + + System.out.println("Incoming request: " + text); + out.println(new Date().getTime()); + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/task2/client/AphorismsClient.java b/src/main/java/task2/client/AphorismsClient.java new file mode 100644 index 0000000..a828d91 --- /dev/null +++ b/src/main/java/task2/client/AphorismsClient.java @@ -0,0 +1,22 @@ +package task2.client; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.Socket; + +public class AphorismsClient { + public static void main(String[] args) { + try (Socket socket = new Socket("localhost", 8080); + InputStream input = socket.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(input))) { + while (true) { + String aphorism = reader.readLine(); + System.out.println("Received aphorism: " + aphorism); + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/task2/server/AphorismSender.java b/src/main/java/task2/server/AphorismSender.java new file mode 100644 index 0000000..5a2ffb9 --- /dev/null +++ b/src/main/java/task2/server/AphorismSender.java @@ -0,0 +1,63 @@ +package task2.server; + + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.io.InputStream; +import java.util.*; + +public class AphorismSender extends Thread { + + private List clients = Collections.synchronizedList(new LinkedList<>()); + private ObjectMapper objectMapper = new ObjectMapper(); + private List aphorisms = new ArrayList<>(); + + public AphorismSender() { + readAphorisms(); + this.start(); + } + + @Override + public void run() { + while (true) { + String randomAphorism = getRandomAphorism(); + for (int i = 0; i < clients.size(); i++) { + ClientHolder client = clients.get(i); + client.getOut().println(randomAphorism); + try { + sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + try { + client.getSocket().close(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + } + } + + public void addClient(ClientHolder client) { + this.clients.add(client); + } + + private void readAphorisms() { + InputStream file = this.getClass().getClassLoader() + .getResourceAsStream("task2/aphorisms.json"); + try { + aphorisms = objectMapper.readValue(file, new TypeReference<>() { + }); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private String getRandomAphorism() { + Random random = new Random(); + return aphorisms.get(random.nextInt(aphorisms.size())); + } + +} diff --git a/src/main/java/task2/server/AphorismsServer.java b/src/main/java/task2/server/AphorismsServer.java new file mode 100644 index 0000000..0170104 --- /dev/null +++ b/src/main/java/task2/server/AphorismsServer.java @@ -0,0 +1,32 @@ +package task2.server; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; + +public class AphorismsServer { + + private static AphorismSender aphorismSender = new AphorismSender(); + + public static void main(String[] args) { + startServer(); + } + + public static void startServer() { + System.out.println("Aphorism server started"); + try (ServerSocket serverSocket = new ServerSocket(8080)) { + while (true) { + Socket clientSocket = serverSocket.accept(); + System.out.println("New client connected"); + try { + aphorismSender.addClient(new ClientHolder(clientSocket)); + } catch (IOException e) { + clientSocket.close(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/task2/server/ClientHolder.java b/src/main/java/task2/server/ClientHolder.java new file mode 100644 index 0000000..64f39cc --- /dev/null +++ b/src/main/java/task2/server/ClientHolder.java @@ -0,0 +1,22 @@ +package task2.server; + +import java.io.*; +import java.net.Socket; + +public class ClientHolder { + private final PrintWriter out; + private final Socket socket; + + public ClientHolder(Socket socket) throws IOException { + this.socket = socket; + out = new PrintWriter(socket.getOutputStream(), true); + } + + public Socket getSocket() { + return socket; + } + + public PrintWriter getOut() { + return out; + } +} diff --git a/src/main/java/task3/Event.java b/src/main/java/task3/Event.java new file mode 100644 index 0000000..2f87717 --- /dev/null +++ b/src/main/java/task3/Event.java @@ -0,0 +1,37 @@ +package task3; + +import java.io.Serializable; +import java.util.Date; + +public class Event implements Serializable { + private final Date date; + private final String message; + private final int id; + + public Event(int id, Date date, String message) { + this.date = date; + this.message = message; + this.id = id; + } + + public Date getDate() { + return date; + } + + public String getMessage() { + return message; + } + + public int getId() { + return id; + } + + @Override + public String toString() { + return "Event{" + + "date=" + date + + ", message='" + message + '\'' + + ", id=" + id + + '}'; + } +} diff --git a/src/main/java/task3/client/EventsClient.java b/src/main/java/task3/client/EventsClient.java new file mode 100644 index 0000000..1a2d2b0 --- /dev/null +++ b/src/main/java/task3/client/EventsClient.java @@ -0,0 +1,27 @@ +package task3.client; + +import task3.Event; + +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.net.Socket; + +public class EventsClient { + public static void main(String[] args) { + try (Socket socket = new Socket("localhost", 8080); + InputStream input = socket.getInputStream(); + ObjectInputStream reader = new ObjectInputStream(input)) { + while (true) { + try { + Event event = (Event) reader.readObject(); + System.out.println("Received event for client: " + event.getId() + ", date: " + event.getDate() + " message: " + event.getMessage()); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/task3/server/ClientHolder.java b/src/main/java/task3/server/ClientHolder.java new file mode 100644 index 0000000..2ac59cc --- /dev/null +++ b/src/main/java/task3/server/ClientHolder.java @@ -0,0 +1,28 @@ +package task3.server; + +import java.io.*; +import java.net.Socket; + +public class ClientHolder { + private final ObjectOutputStream out; + private final int id; + private final Socket socket; + + public ClientHolder(Socket socket, int id) throws IOException { + this.socket = socket; + out = new ObjectOutputStream(socket.getOutputStream()); + this.id = id; + } + + public Socket getSocket() { + return socket; + } + + public ObjectOutputStream getOut() { + return out; + } + + public int getId() { + return id; + } +} diff --git a/src/main/java/task3/server/EventsSender.java b/src/main/java/task3/server/EventsSender.java new file mode 100644 index 0000000..8c5bb6b --- /dev/null +++ b/src/main/java/task3/server/EventsSender.java @@ -0,0 +1,52 @@ +package task3.server; + +import org.apache.commons.lang3.RandomStringUtils; +import task3.Event; + +import java.io.IOException; +import java.util.Date; +import java.util.Map; +import java.util.Random; +import java.util.concurrent.ConcurrentHashMap; + +public class EventsSender extends Thread { + // Почитать про HashMap + private Map clients = new ConcurrentHashMap<>(); + + public EventsSender() { + this.start(); + } + + @Override + public void run() { + while (true) { + if (clients.size() != 0) { + Event event = generateRandomEvent(); + ClientHolder client = clients.get(event.getId()); + try { + client.getOut().writeObject(event); + sleep(3000); + } catch (IOException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + try { + client.getSocket().close(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + } + } + + public void addClient(ClientHolder client) { + this.clients.put(client.getId(), client); + } + + private Event generateRandomEvent() { + Random random = new Random(); + int id = random.nextInt(clients.size()); + System.out.println("Generated event for: " + id); + return new Event(id, new Date(), "Event: " + RandomStringUtils.randomAlphanumeric(10)); + } +} diff --git a/src/main/java/task3/server/EventsServer.java b/src/main/java/task3/server/EventsServer.java new file mode 100644 index 0000000..fde0855 --- /dev/null +++ b/src/main/java/task3/server/EventsServer.java @@ -0,0 +1,33 @@ +package task3.server; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; + + +public class EventsServer { + private static EventsSender eventsSender = new EventsSender(); + + public static void main(String[] args) { + startServer(); + } + + public static void startServer() { + int clientId = 0; + try (ServerSocket serverSocket = new ServerSocket(8080)) { + System.out.println("Events server started"); + while (true) { + Socket clientSocket = serverSocket.accept(); + try { + System.out.println("New client with id: " + clientId + " connected"); + eventsSender.addClient(new ClientHolder(clientSocket, clientId)); + clientId++; + } catch (IOException e) { + clientSocket.close(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/task4/CurrencyExchange.java b/src/main/java/task4/CurrencyExchange.java new file mode 100644 index 0000000..a5e1dd3 --- /dev/null +++ b/src/main/java/task4/CurrencyExchange.java @@ -0,0 +1,37 @@ +package task4; + +import java.io.Serializable; +import java.util.Currency; +import java.util.Objects; + +public class CurrencyExchange implements Serializable { + private final Currency from; + private final Currency to; + + public CurrencyExchange(Currency from, Currency to) { + this.from = from; + this.to = to; + } + + public Currency getFrom() { + return from; + } + + public Currency getTo() { + return to; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CurrencyExchange exchange = (CurrencyExchange) o; + return from.equals(exchange.from) && + to.equals(exchange.to); + } + + @Override + public int hashCode() { + return Objects.hash(from, to); + } +} diff --git a/src/main/java/task4/client/CurrencyClient.java b/src/main/java/task4/client/CurrencyClient.java new file mode 100644 index 0000000..57ed38a --- /dev/null +++ b/src/main/java/task4/client/CurrencyClient.java @@ -0,0 +1,34 @@ +package task4.client; + +import task4.CurrencyExchange; + +import java.io.*; +import java.net.Socket; +import java.util.Currency; + +public class CurrencyClient { + public static void main(String[] args) { + String currencyRate = getCurrencyRate("RUB", "EUR"); + System.out.println(currencyRate); + String currencyRate2 = getCurrencyRate("RUB", "CAD"); + System.out.println(currencyRate2); + } + + public static String getCurrencyRate(String from, String to) { + String rate = ""; + try (Socket socket = new Socket("localhost", 8080); + OutputStream output = socket.getOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(output); + InputStream input = socket.getInputStream(); + ObjectInputStream reader = new ObjectInputStream(input)) { + + out.writeObject(new CurrencyExchange(Currency.getInstance(from), Currency.getInstance(to))); + + Object obj = reader.readObject(); + rate = String.valueOf(obj); + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + return rate; + } +} diff --git a/src/main/java/task4/server/CurrencyRates.java b/src/main/java/task4/server/CurrencyRates.java new file mode 100644 index 0000000..328517b --- /dev/null +++ b/src/main/java/task4/server/CurrencyRates.java @@ -0,0 +1,30 @@ +package task4.server; + +import task4.CurrencyExchange; + +import java.util.Currency; +import java.util.HashMap; +import java.util.Map; + +public class CurrencyRates { + private static Map currencyRates = new HashMap<>(); + + static { + currencyRates.put(new CurrencyExchange(Currency.getInstance("RUB"), Currency.getInstance("RUB")), 1.0); + currencyRates.put(new CurrencyExchange(Currency.getInstance("USD"), Currency.getInstance("USD")), 1.0); + currencyRates.put(new CurrencyExchange(Currency.getInstance("EUR"), Currency.getInstance("EUR")), 1.0); + + currencyRates.put(new CurrencyExchange(Currency.getInstance("RUB"), Currency.getInstance("USD")), 0.014428); + currencyRates.put(new CurrencyExchange(Currency.getInstance("USD"), Currency.getInstance("RUB")), 69.290252); + + currencyRates.put(new CurrencyExchange(Currency.getInstance("RUB"), Currency.getInstance("EUR")), 0.012810); + currencyRates.put(new CurrencyExchange(Currency.getInstance("EUR"), Currency.getInstance("RUB")), 78.061927); + + currencyRates.put(new CurrencyExchange(Currency.getInstance("USD"), Currency.getInstance("EUR")), 0.887865); + currencyRates.put(new CurrencyExchange(Currency.getInstance("EUR"), Currency.getInstance("USD")), 1.126526); + } + + public static double getRate(CurrencyExchange currencyExchange) { + return currencyRates.getOrDefault(currencyExchange, 0.0); + } +} diff --git a/src/main/java/task4/server/CurrencyServer.java b/src/main/java/task4/server/CurrencyServer.java new file mode 100644 index 0000000..4d3eba7 --- /dev/null +++ b/src/main/java/task4/server/CurrencyServer.java @@ -0,0 +1,45 @@ +package task4.server; + +import task4.CurrencyExchange; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.net.ServerSocket; +import java.net.Socket; + +public class CurrencyServer { + + public static void main(String[] args) { + startServer(); + } + + public static void startServer() { + try (ServerSocket serverSocket = new ServerSocket(8080)) { + System.out.println("Currency server started"); + while (true) { + Socket clientSocket = serverSocket.accept(); + System.out.println("New client connected"); + new Thread(() -> { + try { + ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream()); + ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream()); + + CurrencyExchange exchange = (CurrencyExchange) in.readObject(); + double rate = CurrencyRates.getRate(exchange); + System.out.println("Found rate: " + rate); + if(rate == 0.0){ + out.writeObject("Unknown currency exchange"); + } else { + out.writeObject(rate); + } + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + }).start(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/resources/task1/fxml/app.fxml b/src/main/resources/task1/fxml/app.fxml new file mode 100644 index 0000000..810a388 --- /dev/null +++ b/src/main/resources/task1/fxml/app.fxml @@ -0,0 +1,13 @@ + + + + + + + + +