.NET 4.x Как выгрузить объекты System.Net.Sockets - C#
Формулировка задачи:
Здравствуйте специалисты. Помогите разобраться с примером работы двух программок для обмена по сети, что-то вроде чата. Первая проблема это то, что программа не выгружается из памяти при ее закрытии.
Это кусок подключения для Сервера
Немного поколдовав я примерно понял что когда нет соединения с клиентом программа ожидает соединения после listener.Start(). Поставил в событие Closing -> listener.Stop(), программа выгрузилась, но выдало исключение. как правильно выгружать такую программу, заранее благодарю. Да, кстати, когда программа не выгружена она занимает порт, и нельзя ее заново перезапустить. connection.Close -> делать нельзя, потому как объект равен null, соединения нет.
Заранее Благодарю.
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();
Решение задачи: «.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(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д