Как мне остановить работу основного цикла моего сервера? ⇐ 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; } } Я пытался использовать флаг, который сообщал серверу, что ему необходимо завершить работу, но он отключается только после того, как получит две команды выхода, а не одну.
Для практических целей я создаю простую серверную базу данных, она работает в цикле 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; } } Я пытался использовать флаг, который сообщал серверу, что ему необходимо завершить работу, но он отключается только после того, как получит две команды выхода, а не одну.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение