Как мне остановить работу основного цикла моего сервера?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Гость
 Как мне остановить работу основного цикла моего сервера?

Сообщение Гость »


Для практических целей я создаю простую серверную базу данных, она работает в цикле while, и любое новое соединение создает отдельный поток. Я хочу выключать сервер всякий раз, когда один из этих потоков получает команду выхода.

Вот код:

сервер пакетов; импортировать java.io.IOException; импортировать java.net.ServerSocket; общественный класс Main { частный статический окончательный int PORT = 34522; частный статический логический режим = true; статический поток currentThread = Thread.currentThread(); // статический финал CountDownLatch ShutdownLatch = новый CountDownLatch(1); public static void main(String[] args) { // Основной движок приложения Главный двигатель(); } общественная статическая недействительность ShutDown () { currentThread.interrupt(); работает = ложь; } частный static void mainEngine() { System.out.println("Сервер запущен!"); попробуйте (сервер ServerSocket = новый ServerSocket (ПОРТ)) { // Сеанс session = новый сеанс(server.accept()); // сеанс.start(); во время бега) { Сеанс сеанса = новый сеанс (server.accept()); сеанс.start(); } } catch (IOException e) { е.printStackTrace(); } } } сервер пакетов; импортировать java.io.*; импортировать java.net.Socket; импортировать java.util.Objects; сеанс публичного класса расширяет поток { статические данные String[] = новая строка[1001]; // Мне понадобится другой носитель для хранения информации. частный конечный сокет Socket; общественный сеанс (Socket socketForClient) { this.socket = SocketForClient; } // public void runSync() { // попробовать (DataInputStream input = новый DataInputStream(socket.getInputStream()); // Вывод DataOutputStream = новый DataOutputStream(socket.getOutputStream())) { // // Строка inputMessage = input.readUTF(); // System.out.println("Получено: " + inputMessage); // // CommandObject commandObj = parseRequestCommands(inputMessage); // // if (commandObj.getRequestType().equals("exit")) { // System.out.println("Сервер выключается."); // вывод.writeUTF("ОК"); // Система.exit(0); // } // // если (validateNumberPosition(commandObj.getIndex())) { // вывод.writeUTF("ОШИБКА"); // Система.exit(0); // } // // Строка выводаMessage = ""; // // переключатель (commandObj.getRequestType()) { // случай "набор" -> { // outputMessage = saveToDB(commandObj); // } // случай "получить" -> { // outputMessage = getFromDb(commandObj); // } // случай "удалить" -> { // outputMessage = RemoveFromDb(commandObj); // } // } // // вывод.writeUTF(outputMessage); // System.out.println("Отправлено: " + outputMessage); // // сокет.закрытие(); // } catch (IOException e) { // e.printStackTrace(); // } // } общественный недействительный запуск () { попробуйте (ввод DataInputStream = новый DataInputStream(socket.getInputStream()); Выход DataOutputStream = новый DataOutputStream(socket.getOutputStream())) { Строка inputMessage = input.readUTF(); System.out.println("Получено: " + inputMessage); CommandObject commandObj = parseRequestCommands(inputMessage); if (commandObj.getRequestType().equals("выход")) { System.out.println("Сервер выключается."); вывод.writeUTF("ОК"); Main.shutDown(); возвращаться; } если (validateNumberPosition(commandObj.getIndex())) { вывод.writeUTF("ОШИБКА"); Система.выход(0); } Строка выводаMessage = ""; переключатель (commandObj.getRequestType()) { случай "набор" -> { outputMessage = saveToDB (commandObj); } случай "получить" -> { outputMessage = getFromDb (commandObj); } случай «удалить» -> { outputMessage = RemoveFromDb (commandObj); } } вывод.writeUTF(выходное сообщение); System.out.println("Отправлено: " + outputMessage); сокет.закрыть(); } catch (IOException e) { е.printStackTrace(); } } частный CommandObject parseRequestCommands (String inputMessage) { вернуть новый CommandObject(inputMessage); } Private void getRequest() выдает IOException { попробуйте (ввод DataInputStream = новый DataInputStream(socket.getInputStream()); Выход DataOutputStream = новый DataOutputStream(socket.getOutputStream())) { } } частная статическая синхронизированная строка RemoveFromDb (CommandObject cmdObject) { int index = cmdObject.getIndex(); if (индекс >= 0 && индекс < data.length) { if (data[index] == null || !data[index].isEmpty()) { данные[индекс] = ""; } вернуть «ОК»; } еще { вернуть «ОШИБКА»; } } частная статическая синхронизированная строка getFromDb (CommandObject cmdObj) { int index = cmdObj.getIndex(); if (data[index] != null && !Objects.equals(data[index], "")) { вернуть данные[индекс]; // возвращаем «ОК»; } else if (Objects.equals(data[index], "")) { вернуть «ОШИБКА»; } еще { вернуть «ОШИБКА»; } } частная статическая синхронизированная строка saveToDB (CommandObject cmdObject) { System.out.println(cmdObject.getIndex()); данные[cmdObject.getIndex()] = cmdObject.getData(); вернуть «ОК»; } частное статическое логическое значение validateNumberPosition (число int) { число возврата > 100; } } Я пытался использовать флаг, который сообщал серверу, что ему необходимо завершить работу, но он отключается только после того, как получит две команды выхода, а не одну.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»