Добрый день, прошу совета с грамотным использованием событии в приложениях. У меня был проект клиент-сервер на сокетах. Вроде бы разобравшись в делегатах и событиях решил уйти от Console.WriteLine(), там где вывод информации. Для вывода использую события. Вот код самого класса с сервером:
public delegate void GetMessage(string message);
public class Server
{
private Socket listenSocket;
private IPEndPoint ip;
public event GetMessage ServerStarted;
public event GetMessage ClientConnected;
public event GetMessage ClientWrited;
public event GetMessage ClientDisconected;
public Server(int port)
{
listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ip = new IPEndPoint(IPAddress.Any, port);
}
public void StartServer (int backlog)
{
listenSocket.Bind(ip);
listenSocket.Listen(backlog);
ServerStarted?.Invoke($"[{DateTime.Now.ToString()}] Сервер запущен. Ожидаю подключения..");
}
public void ClientAccept ()
{
Socket clientSocket = listenSocket.Accept();
ClientConnected?.Invoke($"[{DateTime.Now.ToString()}] [{((IPEndPoint)clientSocket.RemoteEndPoint).Address.ToString()}] подключился");
Thread cl = new Thread(() => MessageDecode(clientSocket));
cl.Start();
}
private void MessageDecode (Socket clientSocket)
{
byte[] buffer = new byte[clientSocket.SendBufferSize];
int readByte;
commands = cl.CreateCommands();
do
{
readByte = clientSocket.Receive(buffer);
byte[] rData = new byte[readByte];
Array.Copy(buffer, rData, readByte);
string data = Encoding.ASCII.GetString(rData);
ClientWrited?.Invoke($"[{DateTime.Now.ToString()}] [{((IPEndPoint)clientSocket.RemoteEndPoint).Address.ToString()}] написал: " + data);
clientSocket.Send(new byte[3] {89,69,83 });
} while (readByte > 0);
ClientDisconected?.Invoke($"[{DateTime.Now.ToString()}] Клиент отключился");
Console.ReadKey();
}
}
Вот как я вызываю все в Program.cs:
class Program
{
static void Main(string[] args)
{
int port = 904;
Server srv = new Server(port);
srv.ServerStarted += Srv_ServerStarted;
srv.ClientConnected += Srv_ClientConnected;
srv.ClientWrited += Srv_ClientWrited;
srv.ClientDisconected += Srv_ClientDisconected;
try
{
srv.StartServer(500);
}catch
{
Console.WriteLine($"[{DateTime.Now.ToString()} Не удается запустить сервер!!!!!!]");
}
while (true)
{
srv.ClientAccept();
}
}
private static void Srv_ClientDisconected(string message)
{
Console.WriteLine(message);
}
private static void Srv_ClientWrited(string message)
{
Console.WriteLine(message);
}
private static void Srv_ClientConnected(string message)
{
Console.WriteLine(message);
}
private static void Srv_ServerStarted(string message)
{
Console.WriteLine(message);
}
}
Собственно правильно ли все я сделал?
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
В UserControl есть Textbox,в нём есть текстЭтот текст нужно передать в другой TextBox в новой форме
Директива UnityEngineAdvertisements не подтягивается к проекту
ЗдравствуйтеВ проекте использую синглтон (хотя я не совсем понимаю, как его правильно применять)