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;