From dab2acd57be6d17dadfb56732f7aca6df9b37696 Mon Sep 17 00:00:00 2001 From: "Sharikov P.P." Date: Fri, 16 Jan 2026 09:13:10 +0700 Subject: [PATCH] fix console output on Exit server --- f-srv/Program.cs | 81 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 54 insertions(+), 27 deletions(-) diff --git a/f-srv/Program.cs b/f-srv/Program.cs index ab3b4f6..acb7d7a 100644 --- a/f-srv/Program.cs +++ b/f-srv/Program.cs @@ -49,27 +49,41 @@ namespace f_srv // Запускаем сервер в отдельной задаче var serverTask = Task.Run(() => StartServer(ip, port, _cancellationTokenSource.Token)); - - // Ожидаем нажатие клавиши + + // Ожидаем нажатие клавиши с явной обработкой Console.WriteLine("Сервер запущен. Нажмите любую клавишу для остановки..."); - ConsoleKeyInfo ki = Console.ReadKey(); - - // Отправляем сигнал отмены - _cancellationTokenSource.Cancel(); - - // Останавливаем listener - _listener?.Stop(); - - // Ждем завершения сервера - await serverTask; - - if (Console.KeyAvailable) + + // Ждем нажатия клавиши в отдельном потоке + var keyTask = Task.Run(() => { - ConsoleKeyInfo key = Console.ReadKey(); + Console.ReadKey(true); // true - не отображать нажатую клавишу + return true; + }); + + // Ожидаем либо нажатия клавиши, либо завершения сервера + await Task.WhenAny(serverTask, keyTask); + + if (!_cancellationTokenSource.IsCancellationRequested) + { + // Отправляем сигнал отмены + _cancellationTokenSource.Cancel(); + + // Останавливаем listener + _listener?.Stop(); + + // Даем серверу время на корректное завершение + try + { + await Task.WhenAny(serverTask, Task.Delay(2000)); + } + catch + { + // Игнорируем исключения при завершении + } + + Console.WriteLine("Сервер остановлен."); } - - Console.WriteLine(" \r\n "); - Console.WriteLine(" Сервер остановлен."); + return 0; } else @@ -101,11 +115,11 @@ namespace f_srv // Ожидание подключения клиента с таймаутом для проверки отмены var acceptTask = _listener.AcceptTcpClientAsync(); var completedTask = await Task.WhenAny(acceptTask, Task.Delay(1000, cancellationToken)); - + if (completedTask == acceptTask && !cancellationToken.IsCancellationRequested) { var client = await acceptTask; - + // Обработка клиента в отдельной задаче _ = Task.Run(async () => await HandleClient(client, cancellationToken)); } @@ -113,6 +127,12 @@ namespace f_srv catch (OperationCanceledException) { // Игнорируем отмену + break; + } + catch (ObjectDisposedException) + { + // Listener был остановлен + break; } catch (Exception ex) { @@ -125,11 +145,21 @@ namespace f_srv } catch (Exception ex) { - Console.WriteLine($"Ошибка: {ex.Message}"); + if (!cancellationToken.IsCancellationRequested) + { + Console.WriteLine($"Ошибка: {ex.Message}"); + } } finally { - _listener?.Stop(); + try + { + _listener?.Stop(); + } + catch + { + // Игнорируем ошибки при остановке + } } } @@ -145,16 +175,13 @@ namespace f_srv using (var reader = new StreamReader(stream, Encoding.UTF8)) using (var writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true }) { - var buffer = new StringBuilder(); - var charBuffer = new char[1024]; - while (!cancellationToken.IsCancellationRequested) { try { // Чтение строки (до символа новой строки) - var line = await reader.ReadLineAsync(cancellationToken); - + var line = await reader.ReadLineAsync(); + if (line == null) { // Клиент отключился