i have the following task. I need to build a UDP Server / Client program. The server should handle more than one client request. Everything is ready and i just need to handle the multi client requests. I am also unsure about extending Thread. I know that its preferred to implement runnable.
EDIT
i separated know the server into 2 parts. The MainServer.java now creates a Thread. This Thread is the TemperatureServer.java. It waits for the request from the client. But now i create oodless threads. Is there a way to create a thread, only when i receive a request? Or is this the right way?
I know that multithread tests are terrible, but is there a good way to test it here? Don't need a coded test.
MainServer.java:
public class MainServer extends Thread{
private DatagramSocket socket;
private CSVReader csvReader;
private byte[] buf = new byte[256];
public MainServer() {
csvReader = CSVReader.getInstance();
try {
this.socket = new DatagramSocket(4445);
} catch (SocketException e) {
e.printStackTrace();
}
}
public void run() {
while (true) {
DatagramPacket packet = new DatagramPacket(buf, buf.length);
new Thread(new TemperatureServer(socket, packet, csvReader)).start();
}
}
}
TemperatureServer.java
public class TemperatureServer extends Thread{
private byte[] buf = new byte[256];
private DatagramSocket socket;
private DatagramPacket packet;
private boolean running;
private CSVReader csvReader;
public TemperatureServer(DatagramSocket socket, DatagramPacket packet, CSVReader csvReader) {
this.socket = socket;
this.packet = packet;
this.csvReader = csvReader;
}
public void run() {
running = true;
while (running) {
this.packet = new DatagramPacket(buf, buf.length);
try {
socket.receive(packet);
InetAddress address = packet.getAddress();
int port = packet.getPort();
packet = new DatagramPacket(buf, buf.length, address, port);
String received = new String(packet.getData(), 0, packet.getLength());
LocalDate localDate = null;
try {
localDate = LocalDate.parse(received.substring(0, 10));
} catch (DateTimeParseException e) {
e.printStackTrace();
}
TreeMap<LocalTime, Float> tempValuesFromDate = csvReader.getTempValuesFromDate(localDate);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream ous = new ObjectOutputStream(baos);
ous.writeObject(tempValuesFromDate);
byte[] sendingData = baos.toByteArray();
baos.close();
packet = new DatagramPacket(sendingData, sendingData.length, address, port);
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
}