fix unlimiting server reading
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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,6 +63,12 @@ namespace f_srv
|
||||
// Ждем завершения сервера
|
||||
await serverTask;
|
||||
|
||||
if (Console.KeyAvailable)
|
||||
{
|
||||
ConsoleKeyInfo key = Console.ReadKey();
|
||||
}
|
||||
|
||||
Console.WriteLine(" \r\n ");
|
||||
Console.WriteLine(" Сервер остановлен.");
|
||||
return 0;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user