Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Будет ли тут нормальная передача/обработка сообщений? С#

e о Мастер (1191), на голосовании 8 месяцев назад
Вот код
 using System; 
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using CSharpShellCore;
using System.Text.Unicode;
using System.Text;

class Client
{
static Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
static IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2000);
public static bool Connect()
{
socket.Connect(ep);
if(socket.Connected)
{
Console.WriteLine("Подключение выполнено по ip 127.0.0.1 и порту 2000");
return true;
}
else
{
Console.WriteLine("Подключение не выполнено");
return false;
}
}
public static void WriteMessage(string msg)
{
byte[]buffer;
buffer = Encoding.UTF8.GetBytes(msg);
socket.Send(buffer);
ProcessMessage();
}
private static void ProcessMessage()
{
var buffer = new byte[4096];
var dataRead = socket.Receive(buffer);
Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, dataRead));
}
}

class Server
{
static IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2000);
static TcpListener listener = new TcpListener(ep);
static bool isWorking = false;
public static void Start()
{
listener.Start();
isWorking = true;
}
public static void ProcessMessage(List list)
{
while(isWorking)
{
TcpClient client = listener.AcceptTcpClient();
NetworkStream stream = client.GetStream();
list.Add(stream);
byte[] buffer = new byte[client.ReceiveBufferSize];
int bytesRead = stream.Read(buffer,0, buffer.Length);
foreach(NetworkStream s in list)
{
s.Write(buffer, 0, bytesRead);
}
}
}
public static void Stop()
{
listener.Stop();
isWorking = false;
}
}

class Program
{
static void Main(string[] args)
{
List clientList = new List();
}
}
Голосование за лучший ответ
Цен Гуа Мастер (2161) 9 месяцев назад
Запусти
e оМастер (1191) 9 месяцев назад
Я на телефоне на данный момент код пишу, а на телефоне немогу сразу 2 - 3 окна открыть
Цен Гуа Мастер (2161) e о, Ну так код норм, я изучал c# но возможно ошибки есть в коде, потипу букву пропустил
Максим Искусственный Интеллект (210215) 9 месяцев назад
Не можешь на телефоне открыть два окна, тестируй в рамках одного приложения. Каждый раз тестировать код через "ответы" это бесперспективно.
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (258860) 9 месяцев назад
добавлен асинхрон

 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();
}
}
e оМастер (1191) 9 месяцев назад
Что даёт асинхронность?
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (258860) e о, для асинхронной записи во все потоки одновременно
Похожие вопросы