добавлен асинхрон
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
class Client
{
static Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
public static async Task ConnectAsync() =>
await ConnectAsync("127.0.0.1", 2000);
public static async Task ConnectAsync(string ip, int port)
{
try
{
await socket.ConnectAsync(ip, port);
Console.WriteLine($"Подключение выполнено по ip {ip} и порту {port}");
return true;
}
catch (Exception ex)
{
Console.WriteLine($"Подключение не выполнено: {ex.Message}");
return false;
}
}
public static async Task WriteMessageAsync(string msg)
{
byte[] buffer = Encoding.UTF8.GetBytes(msg);
await socket.SendAsync(new ArraySegment(buffer), SocketFlags.None);
await ProcessMessageAsync();
}
private static async Task ProcessMessageAsync()
{
var buffer = new byte[4096];
int bytesRead = await socket.ReceiveAsync(new ArraySegment(buffer), SocketFlags.None);
Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, bytesRead));
}
}
class Server
{
static TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 2000);
static bool isWorking = false;
public static async Task StartAsync()
{
listener.Start();
isWorking = true;
while (isWorking)
{
TcpClient client = await listener.AcceptTcpClientAsync();
_ = ProcessMessageAsync(client);
}
}
private static async Task ProcessMessageAsync(TcpClient client)
{
using (NetworkStream stream = client.GetStream())
{
byte[] buffer = new byte[client.ReceiveBufferSize];
int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
await Task.WhenAll(Server.GetClients().ConvertAll(s => s.WriteAsync(buffer, 0, bytesRead)));
}
}
public static void Stop()
{
listener.Stop();
isWorking = false;
}
}
class Program
{
static async Task Main(string[] args)
{
await Server.StartAsync();
// Пример использования:
Client client = new Client();
await client.ConnectAsync();
await client.WriteMessageAsync("Hello, server!");
Server.Stop();
}
}