fix console output on Exit server

This commit is contained in:
2026-01-16 09:13:10 +07:00
parent 4dee9f4260
commit dab2acd57b

View File

@@ -49,27 +49,41 @@ namespace f_srv
// Запускаем сервер в отдельной задаче // Запускаем сервер в отдельной задаче
var serverTask = Task.Run(() => StartServer(ip, port, _cancellationTokenSource.Token)); var serverTask = Task.Run(() => StartServer(ip, port, _cancellationTokenSource.Token));
// Ожидаем нажатие клавиши // Ожидаем нажатие клавиши с явной обработкой
Console.WriteLine("Сервер запущен. Нажмите любую клавишу для остановки..."); Console.WriteLine("Сервер запущен. Нажмите любую клавишу для остановки...");
ConsoleKeyInfo ki = Console.ReadKey();
// Ждем нажатия клавиши в отдельном потоке
// Отправляем сигнал отмены var keyTask = Task.Run(() =>
_cancellationTokenSource.Cancel();
// Останавливаем listener
_listener?.Stop();
// Ждем завершения сервера
await serverTask;
if (Console.KeyAvailable)
{ {
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; return 0;
} }
else else
@@ -101,11 +115,11 @@ namespace f_srv
// Ожидание подключения клиента с таймаутом для проверки отмены // Ожидание подключения клиента с таймаутом для проверки отмены
var acceptTask = _listener.AcceptTcpClientAsync(); var acceptTask = _listener.AcceptTcpClientAsync();
var completedTask = await Task.WhenAny(acceptTask, Task.Delay(1000, cancellationToken)); var completedTask = await Task.WhenAny(acceptTask, Task.Delay(1000, cancellationToken));
if (completedTask == acceptTask && !cancellationToken.IsCancellationRequested) if (completedTask == acceptTask && !cancellationToken.IsCancellationRequested)
{ {
var client = await acceptTask; var client = await acceptTask;
// Обработка клиента в отдельной задаче // Обработка клиента в отдельной задаче
_ = Task.Run(async () => await HandleClient(client, cancellationToken)); _ = Task.Run(async () => await HandleClient(client, cancellationToken));
} }
@@ -113,6 +127,12 @@ namespace f_srv
catch (OperationCanceledException) catch (OperationCanceledException)
{ {
// Игнорируем отмену // Игнорируем отмену
break;
}
catch (ObjectDisposedException)
{
// Listener был остановлен
break;
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -125,11 +145,21 @@ namespace f_srv
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine($"Ошибка: {ex.Message}"); if (!cancellationToken.IsCancellationRequested)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
} }
finally finally
{ {
_listener?.Stop(); try
{
_listener?.Stop();
}
catch
{
// Игнорируем ошибки при остановке
}
} }
} }
@@ -145,16 +175,13 @@ namespace f_srv
using (var reader = new StreamReader(stream, Encoding.UTF8)) using (var reader = new StreamReader(stream, Encoding.UTF8))
using (var writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true }) using (var writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true })
{ {
var buffer = new StringBuilder();
var charBuffer = new char[1024];
while (!cancellationToken.IsCancellationRequested) while (!cancellationToken.IsCancellationRequested)
{ {
try try
{ {
// Чтение строки (до символа новой строки) // Чтение строки (до символа новой строки)
var line = await reader.ReadLineAsync(cancellationToken); var line = await reader.ReadLineAsync();
if (line == null) if (line == null)
{ {
// Клиент отключился // Клиент отключился