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