diff --git a/src/main/java/java/src/Sending/Data/OnlineStateNotification.java b/src/main/java/java/src/Sending/Data/OnlineStateNotification.java new file mode 100644 index 0000000..da4d4d4 --- /dev/null +++ b/src/main/java/java/src/Sending/Data/OnlineStateNotification.java @@ -0,0 +1,31 @@ +package java.src.Sending.Data; + +import java.src.Peers.Peer; + +public record OnlineStateNotification(Peer sender, Peer receiver) implements Sendable { + + @Override + public EDataType getType() { + return EDataType.OnlineStateNotification; + } + + @Override + public Peer getSender() { + return this.sender; + } + + @Override + public Peer getReceiver() { + return this.receiver; + } + + @Override + public byte[] getMessage() { + String request = + "{\"onlineState\":\"online\"" + + "," + + "\"ipPort\":\"" + sender.ipAddress() + ":" + sender.port() + "\"}"; + return request.getBytes(); + } + +} diff --git a/src/main/java/java/src/Sending/Data/OnlineStateRequest.java b/src/main/java/java/src/Sending/Data/OnlineStateRequest.java new file mode 100644 index 0000000..adc91eb --- /dev/null +++ b/src/main/java/java/src/Sending/Data/OnlineStateRequest.java @@ -0,0 +1,31 @@ +package java.src.Sending.Data; + +import java.src.Peers.Peer; + +public record OnlineStateRequest(Peer sender, Peer receiver) implements Sendable { + + @Override + public EDataType getType() { + return EDataType.OnlineStateRequest; + } + + @Override + public Peer getSender() { + return this.sender; + } + + @Override + public Peer getReceiver() { + return this.receiver; + } + + @Override + public byte[] getMessage() { + String request = + "{\"onlineState\":\"\"" + + "," + + "\"ipPort\":\"" + sender.ipAddress() + ":" + sender.port() + "\"}"; + return request.getBytes(); + } + +} diff --git a/src/main/java/java/src/Sending/Data/OnlineStateResponse.java b/src/main/java/java/src/Sending/Data/OnlineStateResponse.java new file mode 100644 index 0000000..177c0e2 --- /dev/null +++ b/src/main/java/java/src/Sending/Data/OnlineStateResponse.java @@ -0,0 +1,31 @@ +package java.src.Sending.Data; + +import java.src.Peers.Peer; + +public record OnlineStateResponse(Peer sender, Peer receiver) implements Sendable { + + @Override + public EDataType getType() { + return EDataType.OnlineStateResponse; + } + + @Override + public Peer getSender() { + return this.sender; + } + + @Override + public Peer getReceiver() { + return this.receiver; + } + + @Override + public byte[] getMessage() { + String response = + "{\"onlineState\":\"online\"" + + "," + + "\"ipPort\":\"" + sender.ipAddress() + ":" + sender.port() + "\"}"; + return response.getBytes(); + } + +} diff --git a/src/main/java/java/src/Sending/Data/PublishFileNameNotification.java b/src/main/java/java/src/Sending/Data/PublishFileNameNotification.java new file mode 100644 index 0000000..a6e7a80 --- /dev/null +++ b/src/main/java/java/src/Sending/Data/PublishFileNameNotification.java @@ -0,0 +1,31 @@ +package java.src.Sending.Data; + +import java.src.Peers.Peer; + +public record PublishFileNameNotification(Peer sender, Peer receiver, String fileName) implements Sendable { + + @Override + public EDataType getType() { + return EDataType.PublishFileNameNotification; + } + + @Override + public Peer getSender() { + return this.sender; + } + + @Override + public Peer getReceiver() { + return this.receiver; + } + + @Override + public byte[] getMessage() { + String response = + "{\"publishFileName\":\"" + fileName +"\"" + + "," + + "\"ipPort\":\"" + sender.ipAddress() + ":" + sender.port() + "\"}"; + return response.getBytes(); + } + +} diff --git a/src/main/java/java/src/Sending/Data/PullFileListRequest.java b/src/main/java/java/src/Sending/Data/PullFileListRequest.java new file mode 100644 index 0000000..993cf73 --- /dev/null +++ b/src/main/java/java/src/Sending/Data/PullFileListRequest.java @@ -0,0 +1,34 @@ +package java.src.Sending.Data; + +import java.src.Peers.Peer; + +/** + * Is never getting sent because szenario is, that all peers come online and stay online forever. + */ +public record PullFileListRequest(Peer sender, Peer receiver) implements Sendable { + + @Override + public EDataType getType() { + return EDataType.PullFileListRequest; + } + + @Override + public Peer getSender() { + return this.sender; + } + + @Override + public Peer getReceiver() { + return this.receiver; + } + + @Override + public byte[] getMessage() { + String response = + "{\"pullFileList\":\"\"" + + "," + + "\"ipPort\":\"" + sender.ipAddress() + ":" + sender.port() + "\"}"; + return response.getBytes(); + } + +} diff --git a/src/main/java/java/src/Sending/Data/PullFileRequest.java b/src/main/java/java/src/Sending/Data/PullFileRequest.java new file mode 100644 index 0000000..335ae15 --- /dev/null +++ b/src/main/java/java/src/Sending/Data/PullFileRequest.java @@ -0,0 +1,31 @@ +package java.src.Sending.Data; + +import java.src.Peers.Peer; + +public record PullFileRequest(Peer sender, Peer receiver, String fileName) implements Sendable { + + @Override + public EDataType getType() { + return EDataType.PullFileRequest; + } + + @Override + public Peer getSender() { + return this.sender; + } + + @Override + public Peer getReceiver() { + return this.receiver; + } + + @Override + public byte[] getMessage() { + String response = + "{\"pullFile\":\"" + fileName + "\"" + + "," + + "\"ipPort\":\"" + sender.ipAddress() + ":" + sender.port() + "\"}"; + return response.getBytes(); + } + +} diff --git a/src/main/java/java/src/Sending/Data/SendFileReply.java b/src/main/java/java/src/Sending/Data/SendFileReply.java new file mode 100644 index 0000000..b92becd --- /dev/null +++ b/src/main/java/java/src/Sending/Data/SendFileReply.java @@ -0,0 +1,33 @@ +package java.src.Sending.Data; + +import java.src.Peers.Peer; + +public record SendFileReply(Peer sender, Peer receiver, String fileContent, String fileName) implements Sendable { + + @Override + public EDataType getType() { + return EDataType.PullFileRequest; + } + + @Override + public Peer getSender() { + return this.sender; + } + + @Override + public Peer getReceiver() { + return this.receiver; + } + + @Override + public byte[] getMessage() { + String response = + "{\"sendFile\":\"" + fileContent + "\"" + + "," + + "\"fileName\":\"" + fileName + "\"" + + "," + + "\"ipPort\":\"" + sender.ipAddress() + ":" + sender.port() + "\"}"; + return response.getBytes(); + } + +} diff --git a/src/main/java/java/src/Sending/Data/Sendable.java b/src/main/java/java/src/Sending/Data/Sendable.java new file mode 100644 index 0000000..7291e01 --- /dev/null +++ b/src/main/java/java/src/Sending/Data/Sendable.java @@ -0,0 +1,18 @@ +/** + * @author Aaron Moser + */ + +package java.src.Sending.Data; + +import java.src.Peers.Peer; + +/** + * An instance of this class represents data to send to another peer, by also providing information + * about this peer and the receiving peer. + */ +public interface Sendable { + public EDataType getType(); + public Peer getSender(); + public Peer getReceiver(); + public byte[] getMessage(); +} \ No newline at end of file diff --git a/src/main/java/java/src/Sending/SenderThread.java b/src/main/java/java/src/Sending/SenderThread.java new file mode 100644 index 0000000..ca5c3bb --- /dev/null +++ b/src/main/java/java/src/Sending/SenderThread.java @@ -0,0 +1,59 @@ +/** + * @author Aaron Moser + */ + +package java.src.Sending; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.src.Terminatable; +import java.src.Sending.Data.Sendable; + +public class SenderThread extends Thread implements Terminatable { + + private DatagramSocket ds = null; + private SendingQueue sendingQueue = null; + + public SenderThread(DatagramSocket ds, SendingQueue sendingQueue) { + this.ds = ds; + this.sendingQueue = sendingQueue; + } + + private boolean senderThreadRunning = true; + + @Override + public void run() { + while (senderThreadRunning) { + try { + Sendable dataToSent = sendingQueue.take(); + + byte[] fileData = dataToSent.getMessage(); + + if (fileData != null) { + String receiverIpAddress = dataToSent.getReceiver().ipAddress(); + int receiverPort = dataToSent.getReceiver().port(); + int fileDataLength = fileData.length; + + DatagramPacket dp = + new DatagramPacket(fileData, fileDataLength, InetAddress.getByName(receiverIpAddress), receiverPort); + ds.send(dp); + } + } catch (UnknownHostException e) { + System.out.println("Error, host is unknown or unreachable."); + } catch (IOException e) { + System.out.println("Error, wasn't able to send data, because of problem with socket."); + } catch (InterruptedException e) { + System.out.println("Error, sending queue was interrupted. Terminating (this) sending thread.."); + this.terminate(); + } + } + } + + public void terminate() { + senderThreadRunning = false; + } +} + diff --git a/src/main/java/java/src/Sending/SendingQueue.java b/src/main/java/java/src/Sending/SendingQueue.java new file mode 100644 index 0000000..22c7be6 --- /dev/null +++ b/src/main/java/java/src/Sending/SendingQueue.java @@ -0,0 +1,10 @@ +/** + * @author Aaron Moser + */ + +package java.src.Sending; + +import java.src.Sending.Data.Sendable; +import java.util.concurrent.LinkedBlockingQueue; + +public class SendingQueue extends LinkedBlockingQueue {}