Почему не происходит подключение к серверу во второй раз? C#

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

Делаю лабу, и было сказано допилить к проге сервак.Косо-криво сделал и допилил клиентскую часть Но возникла проблема: у меня на формах кнопки, по нажатию на которые происходит соединение с серваком для обмена данными. При первом нажатии все работает как надо, но если нажимаю второй раз, то прога "встает" и не работает. Как решить это я не знаю, потому, прошу вашей помощи. Сервер:

            int port = 8080;

            // Создаем TCP-сокет и привязываем его к IP-адресу и порту
            TcpListener server = new TcpListener(ip, port);
            server.Start();

            // Бесконечный цикл ожидания подключений
            while (true)
            {
                Console.WriteLine("Ожидание подключения...");

                // Ожидаем подключение клиента и создаем сокет для взаимодействия
                TcpClient client = server.AcceptTcpClient();
                Console.WriteLine("Клиент подключен!");

                // Получаем сетевой поток для чтения и записи данных
                NetworkStream stream = client.GetStream();

                // Цикл взаимодействия с клиентом
                while (client.Connected)
                {
                    // Читаем данные из сетевого потока
                    byte[] data = new byte[256];
                    int bytes = stream.Read(data, 0, data.Length);
                    string mesage = Encoding.UTF8.GetString(data, 0, bytes);
                    Console.WriteLine("Клиент: " + mesage);
                    string response = " ";
                    // Отправляем ответ клиенту
                    if(mesage == "password")
                    {
                        response = card.password;

                    }

                    else if(mesage == "money")
                    {
                        response = Convert.ToString(card.money);
                    }

                    else if(mesage == "exit")
                    {
                        stream.Close();
                        client.Close();

                    }

                     byte[] responseData = Encoding.UTF8.GetBytes(response);
                     stream.Write(responseData, 0, responseData.Length);
                } 

Одна из кнопок в клиентской части:

// Устанавливаем IP-адрес и номер порта для подключения
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            int port = 8080;

            // Создаем TCP-сокет и подключаемся к серверу
            TcpClient client = new TcpClient();
            ;
            if (!client.Connected)
            {
            client.Connect(ip, port);

            }
                NetworkStream stream = client.GetStream();
                string message = "password";




                byte[] data = Encoding.UTF8.GetBytes(message);
                stream.Write(data, 0, data.Length);
                stream.Flush();
                // Читаем ответ сервера из сетевого потока
                byte[] data1 = new byte[256];
                int bytes = stream.Read(data1, 0, data1.Length);
                string message1 = Encoding.UTF8.GetString(data1, 0, bytes);

                if (message1 == textBox1.Text)
                {
                    DefaultForm defaultForm = new DefaultForm();
                    defaultForm.Show();
                    this.Hide();


                }
                else
                {
                    attemps++;

                    if (attemps >= maxAttemps)
                    {
                        textBox1.Enabled = false;
                        MessageBox.Show("Вы исчерпали все попытки!");
                        stream.Close();
                        client.Close();
                    }
                    else
                    {
                        MessageBox.Show($"Пароль неверный. Осталось попыток: {maxAttemps - attemps}");
                        string mesage = "exit";
                        byte[] data2 = Encoding.UTF8.GetBytes(mesage);
                        stream.Write(data2, 0, data2.Length);

                    }

                }

Ответы

▲ 0Принят

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