diff --git a/f-cln/Program.cs b/f-cln/Program.cs index 710fa6a..fb65849 100644 --- a/f-cln/Program.cs +++ b/f-cln/Program.cs @@ -1,7 +1,6 @@ using System; using System.CommandLine; using System.CommandLine.Parsing; -using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; @@ -38,8 +37,6 @@ namespace f_cln messageOption }; - rootCommand.Parse("--version").Invoke(); - ParseResult parseResult = rootCommand.Parse(args); if (parseResult.Errors.Count == 0) { @@ -90,21 +87,24 @@ namespace f_cln Console.WriteLine("Подключено к серверу"); using var stream = client.GetStream(); + using var reader = new StreamReader(stream, Encoding.UTF8); + using var writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true }; // Отправка сообщения - var messageBytes = Encoding.UTF8.GetBytes(message + Environment.NewLine); - await stream.WriteAsync(messageBytes, 0, messageBytes.Length); + await writer.WriteLineAsync(message); Console.WriteLine($"Отправлено: {message}"); // Чтение ответа - var buffer = new byte[1024]; - var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length); + var response = await reader.ReadLineAsync(); - if (bytesRead > 0) + if (response != null) { - var response = Encoding.UTF8.GetString(buffer, 0, bytesRead).TrimEnd('\n', '\r'); Console.WriteLine($"Получено: {response}"); } + else + { + Console.WriteLine("Сервер не ответил"); + } } catch (SocketException ex) { @@ -126,7 +126,8 @@ namespace f_cln Console.WriteLine("Введите текст для отправки (или 'exit' для выхода):"); using var stream = client.GetStream(); - var buffer = new byte[1024]; + using var reader = new StreamReader(stream, Encoding.UTF8); + using var writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true }; while (true) { @@ -146,15 +147,13 @@ namespace f_cln try { // Отправка сообщения - var messageBytes = Encoding.UTF8.GetBytes(input + Environment.NewLine); - await stream.WriteAsync(messageBytes, 0, messageBytes.Length); + await writer.WriteLineAsync(input); // Чтение ответа - var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length); + var response = await reader.ReadLineAsync(); - if (bytesRead > 0) + if (response != null) { - var response = Encoding.UTF8.GetString(buffer, 0, bytesRead).TrimEnd('\n', '\r'); Console.WriteLine($"Ответ: {response}"); } else diff --git a/f-srv/Program.cs b/f-srv/Program.cs index 080234b..ab3b4f6 100644 --- a/f-srv/Program.cs +++ b/f-srv/Program.cs @@ -35,12 +35,6 @@ namespace f_srv portOption }; - { - rootCommand.Parse("-h").Invoke(); - rootCommand.Parse("--version").Invoke(); - } - - ParseResult parseResult = rootCommand.Parse(args); if (parseResult.Errors.Count == 0) { @@ -58,7 +52,7 @@ namespace f_srv // Ожидаем нажатие клавиши Console.WriteLine("Сервер запущен. Нажмите любую клавишу для остановки..."); - Console.ReadKey(); + ConsoleKeyInfo ki = Console.ReadKey(); // Отправляем сигнал отмены _cancellationTokenSource.Cancel(); @@ -69,7 +63,13 @@ namespace f_srv // Ждем завершения сервера await serverTask; - Console.WriteLine("Сервер остановлен."); + if (Console.KeyAvailable) + { + ConsoleKeyInfo key = Console.ReadKey(); + } + + Console.WriteLine(" \r\n "); + Console.WriteLine(" Сервер остановлен."); return 0; } else @@ -142,51 +142,46 @@ namespace f_srv { using (client) using (var stream = client.GetStream()) + using (var reader = new StreamReader(stream, Encoding.UTF8)) + using (var writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true }) { - var buffer = new byte[1024]; + var buffer = new StringBuilder(); + var charBuffer = new char[1024]; while (!cancellationToken.IsCancellationRequested) { try { - // Чтение данных от клиента с таймаутом - var readTask = stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken); - var completedTask = await Task.WhenAny(readTask, Task.Delay(1000, cancellationToken)); + // Чтение строки (до символа новой строки) + var line = await reader.ReadLineAsync(cancellationToken); - if (completedTask != readTask) - { - // Таймаут - проверяем отмену и продолжаем цикл - continue; - } - - var bytesRead = await readTask; - - if (bytesRead == 0) + if (line == null) { + // Клиент отключился Console.WriteLine($"Клиент отключился: {clientEndPoint}"); break; } - // Преобразование байтов в строку - var receivedString = Encoding.UTF8.GetString(buffer, 0, bytesRead); - - // Удаление символов новой строки для чистого вывода - var cleanString = receivedString.TrimEnd('\n', '\r'); - Console.WriteLine($"Получено от {clientEndPoint}: {cleanString}"); + Console.WriteLine($"Получено от {clientEndPoint}: {line}"); // Реверсирование строки - var reversedString = ReverseString(cleanString); + var reversedString = ReverseString(line); Console.WriteLine($"Отправка: {reversedString}"); // Отправка реверсированной строки обратно клиенту - var responseBytes = Encoding.UTF8.GetBytes(reversedString + Environment.NewLine); - await stream.WriteAsync(responseBytes, 0, responseBytes.Length, cancellationToken); + await writer.WriteLineAsync(reversedString); } catch (OperationCanceledException) { // Игнорируем отмену при чтении/записи break; } + catch (IOException ex) + { + // Ошибка ввода/вывода - клиент отключился + Console.WriteLine($"Клиент отключился: {clientEndPoint} - {ex.Message}"); + break; + } } } }