create server & client

This commit is contained in:
Sharikov P.P.
2026-01-16 00:30:19 +07:00
parent 879485cb54
commit cc41ec4f55
8 changed files with 884 additions and 0 deletions

179
f-cln/Program.cs Normal file
View File

@@ -0,0 +1,179 @@
using System;
using System.CommandLine;
using System.CommandLine.Parsing;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace f_cln
{
class Program
{
static async Task<int> Main(string[] args)
{
// Создание команды с аргументами
Option<string> ipOption = new("address", new[] { "--ip", "-i" })
{
Description = "IP адрес сервера (по умолчанию: localhost)",
DefaultValueFactory = parseResult => "localhost"
};
Option<int> portOption = new("port", new[] { "--port", "-p" })
{
Description = "Порт сервера (по умолчанию: 1771)",
DefaultValueFactory = parseResult => 1771
};
Option<string?> messageOption = new("message", new[] { "--message", "-m" })
{
Description = "Сообщение для отправки (если не указано, работает в интерактивном режиме)",
Arity = ArgumentArity.ZeroOrOne
};
var rootCommand = new RootCommand("Клиент для отправки строк серверу и получения их в обратном порядке")
{
ipOption,
portOption,
messageOption
};
rootCommand.Parse("--version").Invoke();
ParseResult parseResult = rootCommand.Parse(args);
if (parseResult.Errors.Count == 0)
{
string ip = parseResult.GetValue(ipOption) ?? "localhost";
int port = parseResult.GetValue(portOption);
string? message = parseResult.GetValue(messageOption);
try
{
if (!string.IsNullOrEmpty(message))
{
// Режим однократной отправки
await SendMessage(ip, port, message);
}
else
{
// Интерактивный режим
await RunInteractive(ip, port);
}
return 0;
}
catch (Exception ex)
{
Console.Error.WriteLine($"Ошибка: {ex.Message}");
return 2;
}
}
else
{
foreach (ParseError parseError in parseResult.Errors)
{
Console.Error.WriteLine(parseError.Message);
}
return 1;
}
}
static async Task SendMessage(string ip, int port, string message)
{
try
{
Console.WriteLine($"Подключение к {ip}:{port}...");
using var client = new TcpClient();
await client.ConnectAsync(ip, port);
Console.WriteLine("Подключено к серверу");
using var stream = client.GetStream();
// Отправка сообщения
var messageBytes = Encoding.UTF8.GetBytes(message + Environment.NewLine);
await stream.WriteAsync(messageBytes, 0, messageBytes.Length);
Console.WriteLine($"Отправлено: {message}");
// Чтение ответа
var buffer = new byte[1024];
var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
var response = Encoding.UTF8.GetString(buffer, 0, bytesRead).TrimEnd('\n', '\r');
Console.WriteLine($"Получено: {response}");
}
}
catch (SocketException ex)
{
Console.WriteLine($"Сетевая ошибка: {ex.Message}");
throw;
}
}
static async Task RunInteractive(string ip, int port)
{
try
{
Console.WriteLine($"Подключение к {ip}:{port}...");
using var client = new TcpClient();
await client.ConnectAsync(ip, port);
Console.WriteLine("Подключено к серверу");
Console.WriteLine("Введите текст для отправки (или 'exit' для выхода):");
using var stream = client.GetStream();
var buffer = new byte[1024];
while (true)
{
// Чтение ввода пользователя
Console.Write("> ");
var input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input))
continue;
if (input.Equals("exit", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("Завершение работы...");
break;
}
try
{
// Отправка сообщения
var messageBytes = Encoding.UTF8.GetBytes(input + Environment.NewLine);
await stream.WriteAsync(messageBytes, 0, messageBytes.Length);
// Чтение ответа
var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
var response = Encoding.UTF8.GetString(buffer, 0, bytesRead).TrimEnd('\n', '\r');
Console.WriteLine($"Ответ: {response}");
}
else
{
Console.WriteLine("Сервер отключился");
break;
}
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка при отправке/получении: {ex.Message}");
break;
}
}
}
catch (SocketException ex)
{
Console.WriteLine($"Ошибка подключения: {ex.Message}");
}
}
}
}

17
f-cln/f-cln.csproj Normal file
View File

@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<RootNamespace>f_cln</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<VersionPrefix>1.1.12 </VersionPrefix>
<VersionSuffix>63</VersionSuffix>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.CommandLine" Version="2.0.2" />
</ItemGroup>
</Project>