Classes part of sending logic.

This commit is contained in:
WickedJack99
2024-04-01 17:23:55 +02:00
parent dbd1294323
commit d8a6174a9d
10 changed files with 309 additions and 0 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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<Sendable> {}