Как отключить клиент от сервера, не закрывая при этом приложения - C#

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

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

Приветствую. Имеется 2 приложения сервер-клиент. При загрузке форму сервер запускается на прослушку из класса, отправка так-же из класса. Собственно вопросы: 1)Как правильно завершить поток? Как отключить клиент от сервера, не закрывая при этом приложения. 2)Как научить сервер слушать сразу несколько клиентов? Или хотя бы переходить в режим прослушки после отсоединения первого клиента. Класс сервера:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
 
namespace Server
{
    class Class1
    {
        public static int i;
        public static TcpListener server = new TcpListener(IPAddress.Any, 11000); 
        public static NetworkStream stream; 
        public static TcpClient client;
        public static byte[] datalength = new byte[4];
        public static string message;
        public static void ServerReceive()
        {
            stream = client.GetStream(); 
            new Thread(() => 
            {
                while ((i = stream.Read(datalength, 0, 4)) != 0)
                {
                    byte[] data = new byte[BitConverter.ToInt32(datalength, 0)];
                    stream.Read(data, 0, data.Length);
                    message = System.Environment.NewLine + "Client : " + Encoding.Default.GetString(data);
                    MessageBox.Show(message);
                }
            }).Start(); 
        }
        public static void ServerSend(string msg)
        {
            stream = client.GetStream(); 
            byte[] data; 
            data = Encoding.Default.GetBytes(msg); 
            int length = data.Length; 
            byte[] datalength = new byte[4]; 
            datalength = BitConverter.GetBytes(length); 
            stream.Write(datalength, 0, 4); 
            stream.Write(data, 0, data.Length); 
        }    

    }
}
Класс клиента:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
 
namespace Client
{
    class Class1
    {
        public static string userid;
        public static string userpass;
        public static int i;
        public static TcpClient client; 
        public static NetworkStream stream; 
        public static byte[] datalength = new byte[4]; 
        public static string message;
        public static string messagei;
 
        public static void ClientSend(string msg)
        {
            stream = client.GetStream(); 
            byte[] data; 
            data = Encoding.Default.GetBytes(msg); 
            int length = data.Length;
            byte[] datalength = new byte[4]; 
            datalength = BitConverter.GetBytes(length); 
            stream.Write(datalength, 0, 4);
            stream.Write(data, 0, data.Length); 
        }
        public static void ClientReceive()
        {
 
            stream = client.GetStream(); 
            new Thread(() => 
            {
                while (((i = stream.Read(datalength, 0, 4)) != 0))
                {
                    byte[] data = new byte[BitConverter.ToInt32(datalength, 0)]; 
                    stream.Read(data, 0, data.Length); 
                    {
                        
                        message= System.Environment.NewLine + "Server : " + Encoding.Default.GetString(data); // Encoding.Default.GetString(data); Converts Bytes Received to String
                        MessageBox.Show(message);
                    };
                }
            }).Start(); 
        }
    }
}

Решение задачи: «Как отключить клиент от сервера, не закрывая при этом приложения»

textual
Листинг программы
 public static void ServerReceive()
        {
            stream = client.GetStream();
            bool stop = false;
            new Thread(() =>
            {
                while (!stop)
                {
                    try
                    {
                        if ((i = stream.Read(datalength, 0, 4)) != 0)
                        {
                            byte[] data = new byte[BitConverter.ToInt32(datalength, 0)];
                            stream.Read(data, 0, data.Length);
                            message = System.Environment.NewLine + "Client : " + Encoding.Default.GetString(data);
                            MessageBox.Show(message);
                        }
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Клиент разорвал соединение");
                        Class1.server.Start(); 
                        MessageBox.Show("Waiting For Connection");
                        new Thread(() =>
                        {
                            Class1.client = Class1.server.AcceptTcpClient();
                            MessageBox.Show("Connected To Client");
                            if (Class1.client.Connected) 
                            {
                                Class1.ServerReceive(); 
                            }
                        }).Start();
 
                        stop = true;
                        break;
                    }
                }

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


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

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

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