fix unlimiting server reading

This commit is contained in:
Sharikov P.P.
2026-01-16 01:54:00 +07:00
parent 87bccdddad
commit 4269d891e9
2 changed files with 39 additions and 45 deletions

View File

@@ -1,7 +1,6 @@
using System; using System;
using System.CommandLine; using System.CommandLine;
using System.CommandLine.Parsing; using System.CommandLine.Parsing;
using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@@ -38,8 +37,6 @@ namespace f_cln
messageOption messageOption
}; };
rootCommand.Parse("--version").Invoke();
ParseResult parseResult = rootCommand.Parse(args); ParseResult parseResult = rootCommand.Parse(args);
if (parseResult.Errors.Count == 0) if (parseResult.Errors.Count == 0)
{ {
@@ -90,21 +87,24 @@ namespace f_cln
Console.WriteLine("Подключено к серверу"); Console.WriteLine("Подключено к серверу");
using var stream = client.GetStream(); 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 writer.WriteLineAsync(message);
await stream.WriteAsync(messageBytes, 0, messageBytes.Length);
Console.WriteLine($"Отправлено: {message}"); Console.WriteLine($"Отправлено: {message}");
// Чтение ответа // Чтение ответа
var buffer = new byte[1024]; var response = await reader.ReadLineAsync();
var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
if (bytesRead > 0) if (response != null)
{ {
var response = Encoding.UTF8.GetString(buffer, 0, bytesRead).TrimEnd('\n', '\r');
Console.WriteLine($"Получено: {response}"); Console.WriteLine($"Получено: {response}");
} }
else
{
Console.WriteLine("Сервер не ответил");
}
} }
catch (SocketException ex) catch (SocketException ex)
{ {
@@ -126,7 +126,8 @@ namespace f_cln
Console.WriteLine("Введите текст для отправки (или 'exit' для выхода):"); Console.WriteLine("Введите текст для отправки (или 'exit' для выхода):");
using var stream = client.GetStream(); 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) while (true)
{ {
@@ -146,15 +147,13 @@ namespace f_cln
try try
{ {
// Отправка сообщения // Отправка сообщения
var messageBytes = Encoding.UTF8.GetBytes(input + Environment.NewLine); await writer.WriteLineAsync(input);
await stream.WriteAsync(messageBytes, 0, messageBytes.Length);
// Чтение ответа // Чтение ответа
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}"); Console.WriteLine($"Ответ: {response}");
} }
else else

View File

@@ -35,12 +35,6 @@ namespace f_srv
portOption portOption
}; };
{
rootCommand.Parse("-h").Invoke();
rootCommand.Parse("--version").Invoke();
}
ParseResult parseResult = rootCommand.Parse(args); ParseResult parseResult = rootCommand.Parse(args);
if (parseResult.Errors.Count == 0) if (parseResult.Errors.Count == 0)
{ {
@@ -58,7 +52,7 @@ namespace f_srv
// Ожидаем нажатие клавиши // Ожидаем нажатие клавиши
Console.WriteLine("Сервер запущен. Нажмите любую клавишу для остановки..."); Console.WriteLine("Сервер запущен. Нажмите любую клавишу для остановки...");
Console.ReadKey(); ConsoleKeyInfo ki = Console.ReadKey();
// Отправляем сигнал отмены // Отправляем сигнал отмены
_cancellationTokenSource.Cancel(); _cancellationTokenSource.Cancel();
@@ -69,6 +63,12 @@ namespace f_srv
// Ждем завершения сервера // Ждем завершения сервера
await serverTask; await serverTask;
if (Console.KeyAvailable)
{
ConsoleKeyInfo key = Console.ReadKey();
}
Console.WriteLine(" \r\n ");
Console.WriteLine(" Сервер остановлен."); Console.WriteLine(" Сервер остановлен.");
return 0; return 0;
} }
@@ -142,51 +142,46 @@ namespace f_srv
{ {
using (client) using (client)
using (var stream = client.GetStream()) 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) while (!cancellationToken.IsCancellationRequested)
{ {
try try
{ {
// Чтение данных от клиента с таймаутом // Чтение строки (до символа новой строки)
var readTask = stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken); var line = await reader.ReadLineAsync(cancellationToken);
var completedTask = await Task.WhenAny(readTask, Task.Delay(1000, cancellationToken));
if (completedTask != readTask) if (line == null)
{
// Таймаут - проверяем отмену и продолжаем цикл
continue;
}
var bytesRead = await readTask;
if (bytesRead == 0)
{ {
// Клиент отключился
Console.WriteLine($"Клиент отключился: {clientEndPoint}"); Console.WriteLine($"Клиент отключился: {clientEndPoint}");
break; break;
} }
// Преобразование байтов в строку Console.WriteLine($"Получено от {clientEndPoint}: {line}");
var receivedString = Encoding.UTF8.GetString(buffer, 0, bytesRead);
// Удаление символов новой строки для чистого вывода
var cleanString = receivedString.TrimEnd('\n', '\r');
Console.WriteLine($"Получено от {clientEndPoint}: {cleanString}");
// Реверсирование строки // Реверсирование строки
var reversedString = ReverseString(cleanString); var reversedString = ReverseString(line);
Console.WriteLine($"Отправка: {reversedString}"); Console.WriteLine($"Отправка: {reversedString}");
// Отправка реверсированной строки обратно клиенту // Отправка реверсированной строки обратно клиенту
var responseBytes = Encoding.UTF8.GetBytes(reversedString + Environment.NewLine); await writer.WriteLineAsync(reversedString);
await stream.WriteAsync(responseBytes, 0, responseBytes.Length, cancellationToken);
} }
catch (OperationCanceledException) catch (OperationCanceledException)
{ {
// Игнорируем отмену при чтении/записи // Игнорируем отмену при чтении/записи
break; break;
} }
catch (IOException ex)
{
// Ошибка ввода/вывода - клиент отключился
Console.WriteLine($"Клиент отключился: {clientEndPoint} - {ex.Message}");
break;
}
} }
} }
} }