У меня есть следующая задача.Мне нужно собрать программу UDP Server / Client.Сервер должен обрабатывать более одного клиентского запроса.Все готово, и мне просто нужно обрабатывать запросы нескольких клиентов.Я также не уверен насчет расширения темы.Я знаю, что предпочтительнее реализовать runnable.
EDIT
Я разделил сервер на две части.MainServer.java теперь создает поток.Этот поток является TemperatureServer.java.Он ждет запроса от клиента.Но теперь я создаю безводные темы.Есть ли способ создать тему, только когда я получаю запрос?Или это правильный путь?
Я знаю, что многопоточные тесты ужасны, но есть ли хороший способ проверить это здесь?Не требуется кодовый тест.
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();
}
}