.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();
}
}
}