Будет ли тут нормальная передача/обработка сообщений? С#
Вот код
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
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<NetworkStream> 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 <Client> clientList = new List<Client>();
}
}
По дате
По рейтингу
Запусти
добавлен асинхрон
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
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<bool> ConnectAsync() =>
await ConnectAsync("127.0.0.1", 2000);
public static async Task<bool> 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<byte>(buffer), SocketFlags.None);
await ProcessMessageAsync();
}
private static async Task ProcessMessageAsync()
{
var buffer = new byte[4096];
int bytesRead = await socket.ReceiveAsync(new ArraySegment<byte>(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();
}
}
Не можешь на телефоне открыть два окна, тестируй в рамках одного приложения. Каждый раз тестировать код через "ответы" это бесперспективно.