create server & client
This commit is contained in:
179
f-cln/Program.cs
Normal file
179
f-cln/Program.cs
Normal 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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user