.NET 4.x Как выгрузить объекты System.Net.Sockets - C#

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

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

Здравствуйте специалисты. Помогите разобраться с примером работы двух программок для обмена по сети, что-то вроде чата. Первая проблема это то, что программа не выгружается из памяти при ее закрытии. Это кусок подключения для Сервера
  listener = new TcpListener(10001); 
                              listener.Start(); 
                               object[] args = new object[2]; 
                while (true)
                {

                    args[0]  = "Ждем соединения" + "\r\n";  параметров
                    args[1] = false; 
                    this.BeginInvoke(delegateLinkAddRichTextBox,args); 
                                    connection = listener.AcceptSocket(); 
                                                         socketStream = new NetworkStream(connection); // поток используемый для отправки данных

// - ----- После окончания соединения
  writer.Close();
                    reader.Close();
                    socketStream.Close();
                    connection.Close();
Немного поколдовав я примерно понял что когда нет соединения с клиентом программа ожидает соединения после listener.Start(). Поставил в событие Closing -> listener.Stop(), программа выгрузилась, но выдало исключение. как правильно выгружать такую программу, заранее благодарю. Да, кстати, когда программа не выгружена она занимает порт, и нельзя ее заново перезапустить. connection.Close -> делать нельзя, потому как объект равен null, соединения нет. Заранее Благодарю.

Решение задачи: «.NET 4.x Как выгрузить объекты System.Net.Sockets»

textual
Листинг программы
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net.Sockets;
using System.IO;
 
namespace ChatServer
{
    
    
     
    public partial class Server : System.Windows.Forms.Form
    {
        public delegate void AddRichTextBox(string strT, bool append);
        public AddRichTextBox delegateLinkAddRichTextBox;
 
        private Socket connection;
        private Thread readThreed;
        private NetworkStream socketStream;
        private BinaryReader reader;
        private BinaryWriter writer;
        TcpListener listener;
 
 
        public Server()
        {
 
            delegateLinkAddRichTextBox = new AddRichTextBox(AddRichTextBoxMethod);
            InitializeComponent();
            readThreed = new Thread(new ThreadStart(RunServer));//(RunServer());
            readThreed.Start();
 
        }
 
        public void AddRichTextBoxMethod(string strT, bool append)
        {
 
            if(!append) richTextBoxRecieve.Text = strT;
            else richTextBoxRecieve.Text += strT;
            //flag_obrabotkaRX = false;
        }
 
        public void RunServer()
        {
            
            int count = 1;
            // ожидает клиентского соединения и отправляет данные
            try
            {
                //шаг 1 
                listener = new TcpListener(10001); // Ожидаем передачу данных для указанного порта
                //шаг 2 ожидаем запрос на соединения
            //!!!!!!!!!!!!!!!!!! ОЖИДАНИЕ ЗАПРОСА !!!!!!!!!!!!!!!!!!!!!!
                listener.Start(); // запуск ожидания входящих запросов на подключение
                //шаг 3 установка соединения по запросу клиента
                object[] args = new object[2]; //массив обънектов, который может иметь разные типы
                while (true)//создание бесконечного цикла для ожидания зжапроса на соединение
                {
                    
                   // this.BeginInvoke(new MethodInvoker(ggg));
                    args[0]  = "Ждем соединения" + "\r\n";  // эти массивы будут переданы методу-делегату в качестве параметров
                    args[1] = false; 
                    this.BeginInvoke(delegateLinkAddRichTextBox,args); //Ждем соединения - хитрая передача параметров методу  - делегату из другого потока -
                
                    
        //private Socket connection;
        //private Thread readThreed;
        //private NetworkStream socketStream;
                    
      //!!!!! ПРИНЯТЫЙ ЗАПРОС НА СОЕДИНЕНИЕ !!!!!!!!!!!!!!!!!!!!!!!
                    connection = listener.AcceptSocket(); // принимает ожидающий запрос на соединение, программа будет здвесь висеть до тех пор пока не увидет запрос //   // Возвращает:   Объект System.Net.Sockets.Socket, используемый для приема и передачи данных.
                    
                    //создание объектов для передачи по потоку
                    //!!!!!!!ПОТОК!!!!!!!!!!!!!
                    socketStream = new NetworkStream(connection); // поток используемый для отправки данных
                    writer = new BinaryWriter(socketStream);
                    reader = new BinaryReader(socketStream);
                    args[0] = "Cоединение " + count.ToString() + " Прием" + "\r\n";
                    args[1]  = true ;
                    this.BeginInvoke(delegateLinkAddRichTextBox, args); 
                    //richTextBoxRecieve.Text += "Cоединение" + count + "Прием" + "\r\n";
                    //информирует клиента о успешном соединении
                    writer.Write("CLIENT>>> Connection Succesfully");
 
                    string theReply = "";
                    //Шаг 4 считывание строки данных от клиента
                    do
                    {
                        try
                        {
                            //считывает строку отправленную на сервер
                            theReply = reader.ReadString();
                            args[0] = "\r\n" + theReply;
                            args[1] = true;
                            this.BeginInvoke(delegateLinkAddRichTextBox, args); 
                            
                        
                            //обработка исключения при считывания данных
                        }
                        catch (Exception exc)
                        {
                            break;
                        }
 
                    }
                    while (theReply != "CLIENT>>> TERMINATE" && connection.Connected);
                   // richTextBoxRecieve.Text += "\r\n User Terminated connection";
                    //Шаг5: закрытие соединения
                    writer.Close();
                    reader.Close();
                    socketStream.Close();
                    connection.Close();
                   
                    
                    ++count;
                }
 
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.ToString());
            }
        }
 
        private void ggg()
        {
            richTextBoxRecieve.Text = "Ждем соединения" + "\r\n";
 
        }
 
        private void Server_Load(object sender, EventArgs e)
        {
          
        }
 
        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                if (e.KeyCode == Keys.Enter&&connection!=null)
                {
                    writer.Write("SERVER>>> " + textBox1.Text);
                    richTextBoxRecieve.Text += "\r\nSERVER>>> " + textBox1.Text;
                 //если пользователь просигнаолизировал клиенту конец соединения
                    if (textBox1.Text == "TERMINATE") connection.Close();
                    textBox1.Clear();
                }
            }
            catch (SocketException exc)
            {
                richTextBoxRecieve.Text += "\nError writing object";
            }
        }
 
        private void Server_FormClosing(object sender, FormClosingEventArgs e)
        {
            //writer.Close();
            //reader.Close();
            //socketStream.Close();
            //connection.Close();
            listener.Stop();
            
            
           
        }
    }
}

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


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

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

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