Многопоточный UDP-сервер - PullRequest
       17

Многопоточный UDP-сервер

0 голосов
/ 18 декабря 2018

У меня есть следующая задача.Мне нужно собрать программу 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();
}
}
...