From 72eafc8c3cdc3188917eb00d53ddb89988f66032 Mon Sep 17 00:00:00 2001 From: WickedJack99 Date: Thu, 28 Dec 2023 21:51:11 +0100 Subject: [PATCH] Moved functionality of sending and receiving messages to and from server into separate threads. --- src/main/java/connect/src/Client.java | 4 +- src/main/java/connect/src/Receiver.java | 59 +++++++++++++++++++ src/main/java/connect/src/Sender.java | 73 ++++++++++++++++++++++++ src/main/java/connect/src/TLSClient.java | 56 ++++-------------- 4 files changed, 145 insertions(+), 47 deletions(-) create mode 100644 src/main/java/connect/src/Receiver.java create mode 100644 src/main/java/connect/src/Sender.java diff --git a/src/main/java/connect/src/Client.java b/src/main/java/connect/src/Client.java index 56b6ff3..0a4d701 100644 --- a/src/main/java/connect/src/Client.java +++ b/src/main/java/connect/src/Client.java @@ -7,7 +7,7 @@ import data.src.ControllerToConnectionClient.ControllerToConnectionClientData; public interface Client { public boolean createConnection(ControllerToConnectionClientData controllerToConnectionClientData); - public void sendData(String data); - public void receiveData(); + public void startSender(); + public void startReceiver(); public void closeConnection(); } diff --git a/src/main/java/connect/src/Receiver.java b/src/main/java/connect/src/Receiver.java new file mode 100644 index 0000000..1f11e76 --- /dev/null +++ b/src/main/java/connect/src/Receiver.java @@ -0,0 +1,59 @@ +/** + * @author Aaron Moser + * @date 26.12.2023 + */ +package connect.src; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import queues.src.ReceivingQueue; + +public class Receiver extends Thread { + private static Receiver instance = null; + + private boolean receiverRunning = false; + + BufferedReader reader = null; + + private Receiver() {} + + public static Receiver getInstance() { + if (instance == null) { + instance = new Receiver(); + } + return instance; + } + + @Override + public void run() { + receiverRunning = true; + while (receiverRunning) { + receiveData(); + } + } + + public void receiveData() { + try { + if (TLSClient.getSSLSocket().isConnected()) { + if (reader == null) { + reader = new BufferedReader(new InputStreamReader(TLSClient.getSSLSocket().getInputStream())); + } + if (reader != null) { + String response; + while ((response = reader.readLine()) != null) { + //System.out.println(response); + ReceivingQueue.getInstance().add(response); + } + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void stopThread() { + this.receiverRunning = false; + } +} diff --git a/src/main/java/connect/src/Sender.java b/src/main/java/connect/src/Sender.java new file mode 100644 index 0000000..779ca03 --- /dev/null +++ b/src/main/java/connect/src/Sender.java @@ -0,0 +1,73 @@ +/** + * @author Aaron Moser + * @date 26.12.2023 + */ +package connect.src; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.net.ssl.SSLSocket; + +import queues.src.SendingQueue; + +/** + * TODO change pattern from singleton to dependency injection. + */ +public class Sender extends Thread { + private static Sender instance = null; + + private boolean senderRunning = false; + + private PrintWriter writer = null; + + private Sender() {} + + public static Sender getInstance() { + if (instance == null) { + instance = new Sender(); + } + return instance; + } + + @Override + public void run() { + senderRunning = true; + while (senderRunning) { + try { + // Wait until controller puts requests into sending queue. + String item = SendingQueue.getInstance().take(); + System.out.println("Sender sends: " + item); + sendData(item); + } catch (InterruptedException e) { + System.out.println("Sender thread was interrupted."); + Thread.currentThread().interrupt(); + return; + } + } + } + + private void sendData(String data) { + try { + if (TLSClient.getSSLSocket().isConnected()) { + if (writer == null) { + writer = new PrintWriter(TLSClient.getSSLSocket().getOutputStream()); + } + if (writer != null && data != null) { + writer.println(data); + writer.flush(); + } else { + System.out.println("Connection is not established."); + } + } else { + System.out.println("SSLSocket is null."); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void stopThread() { + this.senderRunning = false; + } +} diff --git a/src/main/java/connect/src/TLSClient.java b/src/main/java/connect/src/TLSClient.java index 95ec349..a5e4d6e 100644 --- a/src/main/java/connect/src/TLSClient.java +++ b/src/main/java/connect/src/TLSClient.java @@ -6,7 +6,6 @@ package connect.src; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.UnknownHostException; @@ -27,9 +26,11 @@ import data.src.ControllerToConnectionClient.ControllerToConnectionClientData; public final class TLSClient implements Client { - private SSLSocket sslSocket; - private BufferedReader reader; - private PrintWriter writer; + private static SSLSocket sslSocket; + + public static synchronized SSLSocket getSSLSocket() { + return sslSocket; + } public boolean createConnection(ControllerToConnectionClientData controllerToConnectionClientData) { try { @@ -76,56 +77,21 @@ public final class TLSClient implements Client { } } - public void sendData(String data) { - try { - writer = new PrintWriter(sslSocket.getOutputStream()); - if (sslSocket != null && sslSocket.isConnected() && writer != null) { - writer.println("Hello Server!"); - writer.flush(); - if (null != data) { - writer.println(data); - writer.flush(); - } - } else { - System.out.println("Connection is not established."); - } - } catch (IOException e) { - e.printStackTrace(); - } + public void startSender() { + Sender.getInstance().start(); } - public void receiveData() { - try { - reader = new BufferedReader(new InputStreamReader(sslSocket.getInputStream())); - if (null != reader) { - String response; - while ((response = reader.readLine()) != null) { - System.out.println(response); - } - } - } catch (IOException e) { - e.printStackTrace(); - } + public void startReceiver() { + Receiver.getInstance().start(); } public void closeConnection() { try { - if (null != reader) { - reader.close(); - } - if (null != writer) { - writer.close(); + if (sslSocket != null) { + sslSocket.close(); } } catch (IOException e) { e.printStackTrace(); - } finally { - try { - if (null != sslSocket) { - sslSocket.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } } } }