fix console output on Exit server
This commit is contained in:
@@ -50,26 +50,40 @@ namespace f_srv
|
||||
// Запускаем сервер в отдельной задаче
|
||||
var serverTask = Task.Run(() => StartServer(ip, port, _cancellationTokenSource.Token));
|
||||
|
||||
// Ожидаем нажатие клавиши
|
||||
// Ожидаем нажатие клавиши с явной обработкой
|
||||
Console.WriteLine("Сервер запущен. Нажмите любую клавишу для остановки...");
|
||||
ConsoleKeyInfo ki = Console.ReadKey();
|
||||
|
||||
// Ждем нажатия клавиши в отдельном потоке
|
||||
var keyTask = Task.Run(() =>
|
||||
{
|
||||
Console.ReadKey(true); // true - не отображать нажатую клавишу
|
||||
return true;
|
||||
});
|
||||
|
||||
// Ожидаем либо нажатия клавиши, либо завершения сервера
|
||||
await Task.WhenAny(serverTask, keyTask);
|
||||
|
||||
if (!_cancellationTokenSource.IsCancellationRequested)
|
||||
{
|
||||
// Отправляем сигнал отмены
|
||||
_cancellationTokenSource.Cancel();
|
||||
|
||||
// Останавливаем listener
|
||||
_listener?.Stop();
|
||||
|
||||
// Ждем завершения сервера
|
||||
await serverTask;
|
||||
|
||||
if (Console.KeyAvailable)
|
||||
// Даем серверу время на корректное завершение
|
||||
try
|
||||
{
|
||||
ConsoleKeyInfo key = Console.ReadKey();
|
||||
await Task.WhenAny(serverTask, Task.Delay(2000));
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Игнорируем исключения при завершении
|
||||
}
|
||||
|
||||
Console.WriteLine(" \r\n ");
|
||||
Console.WriteLine("Сервер остановлен.");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
@@ -113,6 +127,12 @@ namespace f_srv
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
// Игнорируем отмену
|
||||
break;
|
||||
}
|
||||
catch (ObjectDisposedException)
|
||||
{
|
||||
// Listener был остановлен
|
||||
break;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -124,13 +144,23 @@ namespace f_srv
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (!cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
Console.WriteLine($"Ошибка: {ex.Message}");
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
try
|
||||
{
|
||||
_listener?.Stop();
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Игнорируем ошибки при остановке
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static async Task HandleClient(TcpClient client, CancellationToken cancellationToken)
|
||||
@@ -145,15 +175,12 @@ 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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user