Многопоточное клиент-серверное приложение TCP

Рейтинг: 0Ответов: 0Опубликовано: 02.06.2023

Подскажите, как лучше реализовать часть подключения и обработки клиента.

Когда пытался найти решение в интернете, находил только простые примеры, где вся обработка заключалась в отправке сообщения на сервер и получения ответа и всё.
Я же пытаюсь сделать сервер, который создаёт поток для каждого клиента, где происходит неоднократные обмены данными.

У меня происходит какая-то вакханалия, и сервер начинает хавать больше оперативки с каждым новым сообщением от клиента, доходя до 11 гб. Подозреваю, что сервак создаёт отдельный поток для каждого сообщения, и это объясняет, почему моя программа не выполняет задачу как надо.

Вот мой код:

static  void Main (string [] args)
        {
            

            const string ip = "127.0.0.1";
            const int port = 8080;

            

            

            var tcpListener = new TcpListener(IPAddress.Parse(ip), port);


            try
            {
                tcpListener.Start();




                while (true)
                {

                    Task.Run(async () => await ProcessClientAsync());

                }
                
                    
                

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            finally
            {
                
                tcpListener.Stop();
            }



            async Task ProcessClientAsync()
            {

                var tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


                var df = new DataFilter();
                await Task.Run(() =>
                {
                    while (true)
                    {
                        tcpClient = tcpListener.AcceptSocket();

                        string BackAnswer;

                        var datatraider = new DataEncoder(tcpClient);

                        int state = df.TakingData(datatraider.message);

                        if (state == 2)
                        {
                            BackAnswer = "false";
                        }

                        else if (state == 1)
                        {
                            BackAnswer = "true";
                        }

                        else
                        {
                            break;
                        }

                        var data = Encoding.UTF8.GetBytes(BackAnswer);

                        tcpClient.Send(data);

                    }
                });
                

                tcpClient.Close();
           }
                
}
                
        

Ответы

Ответов пока нет.