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;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д