Использование событии в приложении

236
10 января 2018, 15:26

Добрый день, прошу совета с грамотным использованием событии в приложениях. У меня был проект клиент-сервер на сокетах. Вроде бы разобравшись в делегатах и событиях решил уйти от 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);
    }
}

Собственно правильно ли все я сделал?

READ ALSO
Передача данных из UserControl в другую форму

Передача данных из UserControl в другую форму

В UserControl есть Textbox,в нём есть текстЭтот текст нужно передать в другой TextBox в новой форме

191
Директива using не нужна - UnityEngine.Advertisements

Директива using не нужна - UnityEngine.Advertisements

Директива UnityEngineAdvertisements не подтягивается к проекту

465
Правильное использование синглтона

Правильное использование синглтона

ЗдравствуйтеВ проекте использую синглтон (хотя я не совсем понимаю, как его правильно применять)

211
Передать в контроллер параметр через Ajax

Передать в контроллер параметр через Ajax

Есть представление с такой ссылкой :

178