Socket не могу понять в чем дело, не закрывается клиент или сервер - C#

Узнай цену своей работы

Формулировка задачи:

Где то в просторах инета (возможно даже на этом форуме) нашел пример по клиент серверу на цокетах, смастерил клиент и сервер, все хорошо все работает, но, немогу отсоединится клиентом или серваком, если закрываю клиента, иснет сервер, если сервак закрываю виснет клиент, помогите ? вот сервер:
// Здесь будет хранится статус сервера
        bool isServerRunning;
        // Здесь будет список наших клиентов
        private Hashtable clients;
        // Это сокет нашего сервера
        Socket listener;
        // Порт, на котором будем прослушивать входящие соединения
        int port = 3957;
        // Точка для прослушки входящих соединений (состоит из адреса и порта)
        IPEndPoint Point;
        // Список потоков
        private Thread server_thread;
        private List<Thread> threads_clients = new List<Thread>();

        private void ServerStart()
        {
            try
            {
                clients = new Hashtable(30);
                isServerRunning = true;
                listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                // Определяем конечную точку, IPAddress.Any означает что наш сервер будет принимать входящие соединения с любых адресов
                Point = new IPEndPoint(IPAddress.Any, port);
                // Связываем сокет с конечной точкой
                listener.Bind(Point);
                // Начинаем слушать входящие соединения
                listener.Listen(10);
 
                SocketAccepter();
                MessagesLog.Text += "Сервер запущен.";
            }
            catch (Exception error)
            {
                MessageBox.Show(error.ToString());
            }
 
        }

        private void SocketAccepter()
        {
            try
            {
                // Запускаем цикл в отдельном потоке, чтобы приложение не зависло
                server_thread = new Thread(delegate()
                {
                    while (isServerRunning)
                    {
                        // Создаем новый сокет, по которому мы сможем обращаться клиенту
                        // Этот цикл остановится, пока какой-нибудь клиент не попытается присоединиться к серверу
                        Socket client = listener.Accept();
                        // Теперь, обратившись к объекту client, мы сможем отсылать и принимать пакеты от последнего подключившегося пользователя.
                        // Добавляем подключенного клиента в список всех клиентов, для дальнейшей массовой рассылки пакетов
                        clients.Add(client, "");
                        // Начинаем принимать входящие пакеты
                        Thread thh = new Thread(delegate()
                        {
                            MessageReceiver(client);
                        });
 
                Dispatcher.BeginInvoke((ThreadStart)delegate
                {
                        MessagesLog.Text += "\r\nКлиент подключился.";
                }, DispatcherPriority.Normal, null);
 
                        thh.Start();
 
                    }
                });
                // Приведенный выше цикл пока что не работает, запускаем поток. Теперь цикл работает.
                server_thread.Start();
            }
            catch (Exception error)
            {
                MessageBox.Show(error.ToString());
            }
 
        }

        private void MessageReceiver(Socket r_client)
        {
            // Для каждого нового подключения, будет создан свой поток для приема пакетов
            Thread th = new Thread(delegate()
            {
                while (isServerRunning)
                {
                    try
                    {
                        // Сюда будем записывать принятые байты
                        if (r_client.Connected)
                        {
 
                            byte[] bytes = new byte[1024];
                            // Принимаем 
                            int rec_length = r_client.Receive(bytes);
                            if (bytes.Length != 0)
                            {
                                string data = Encoding.UTF8.GetString(bytes, 0, rec_length);
                                Dispatcher.BeginInvoke((ThreadStart) delegate
                                {
                                    MessagesLog.Text += "\r\nОт клиента:" + r_client.Handle + " принято:" + rec_length +
                                                        ":" + data;
                                }, DispatcherPriority.Normal, null);
 
                                // Отсылаем принятый пакет от клиента всем клиентам
                                MessageSender(r_client, data);
                            }
                        }
                        else
                        {
                            r_client.Shutdown(SocketShutdown.Both);
                            r_client.Close();
                            break;
                        }
                    }
                    catch (Exception error)
                    {
                        MessageBox.Show(error.ToString());
                    }
                }
            });
            th.Start();
            threads_clients.Add(th);
        }

        private void MessageSender(Socket c_client, string msg)
        {
            try
            {
                // Отправляем пакет
                    byte[] bytes = new byte[msg.Length];
                    bytes = Encoding.UTF8.GetBytes(msg);
                    
                    c_client.Send(bytes);
                    Dispatcher.BeginInvoke((ThreadStart)delegate
                    {
                        MessagesLog.Text += "\r\nКлиенту:" + c_client.Handle + " отправляем:" + bytes.Length + ":" + msg;
                    }, DispatcherPriority.Normal, null);
            }
            catch (Exception error)
            {
                MessageBox.Show(error.ToString());
            }
        }

        private void MenuItem_Start(object sender, RoutedEventArgs e)
        {
            ServerStart();
        }
 
        private void ServerStop()
        {
            isServerRunning = false;
            listener.Shutdown(SocketShutdown.Both);
            if (clients!=null)
            {
                foreach (Socket cl in clients.Keys)
                {
                    cl.Shutdown(SocketShutdown.Both);
                    cl.Close();
 
                }
            }
        }

        private void MenuItem_Stop(object sender, RoutedEventArgs e)
        {
            ServerStop();
        }
 
        private void MainForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            ServerStop();
        }
 
        private void MainForm_Loaded(object sender, RoutedEventArgs e)
        {
            ServerStart();
        }
а вот клиент:
        // Статус клиента
        private bool isClientRunning;
        // Сокет клиента
        private Socket client;
        // Адрес сервера
        private IPAddress ip = IPAddress.Parse("127.0.0.1");
        // Порт, по которому будем присоединяться
        private int port = 3957;
        // Список потоков
        private Thread client_thread;
 
        void Connect()
        {
            try
            {
                isClientRunning = true;
                client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                client.Connect(ip, port);
                Receiver();
                MessagesLog.Text += "Подключение к серверу осуществлено.";
            }
            catch (Exception error)
            {
                MessageBox.Show(error.ToString());
            }
        }

        void Receiver()
        {
            client_thread = new Thread(delegate()
            {
                while (isClientRunning)
                {
                    try
                    {
                        if (client.Connected)
                        {
                            
                            byte[] bytes = new byte[1024];
                            // Принимает данные от сервера в формате "X|Y"
                            int rec_length=client.Receive(bytes);
                            if (bytes.Length != 0)
                            {
                                string data = Encoding.UTF8.GetString(bytes, 0, rec_length);
                                Dispatcher.BeginInvoke((ThreadStart) delegate
                                {
                                    MessagesLog.Text += "\r\nОт сервера:" + client.Handle + " принято:" + rec_length + ":" + data;
                                }, DispatcherPriority.Normal, null);
                            }
                        }
                        else
                        {
                            break;
                        } 
 
                    }
                    catch (Exception error)
                    {
                        MessageBox.Show(error.ToString());
                    }
                }
            });
            client_thread.Start();
        }
 
        void Sender(string msg)
        {
            try
            {
                    byte[] bytes = new byte[msg.Length];
                    bytes = Encoding.UTF8.GetBytes(msg);
                    client.Send(bytes);
                    string data = Encoding.UTF8.GetString(bytes);
                    MessagesLog.Text += "\r\nСерверу:" + client.Handle + " отправляем:" + bytes.Length + ":" + data;
            }
            catch (Exception error)
            {
                MessageBox.Show(error.ToString());
            }
        }

        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }
        private void MenuItem_Start(object sender, RoutedEventArgs e)
        {
            if (client ==null)
            {
                Connect();
            }
            Sender("Тест");
        }
 
        private void Window_Closed(object sender, EventArgs e)
        {
            if (client!=null)
            {
                client.Disconnect(true);
                client.Shutdown(SocketShutdown.Both);
                client.Close();
            }
        }
замучался совсем уже с этим закрытием клиента-сервера, помогите плиз?

Решение задачи: «Socket не могу понять в чем дело, не закрывается клиент или сервер»

textual
Листинг программы
thread.IsBackground = true;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5
Похожие ответы