当我关闭我的客户端时,我的服务器崩溃了

时间:2018-02-11 21:12:54

标签: c# winforms sockets tcp

在c#上使用Visual Studio Windows窗体,我制作了一个包含无限客户端和一台服务器的聊天程序。在连接任何客户端之前,必须激活服务器。但是,在连接一个或多个客户端并关闭其中一个客户端后,服务器崩溃。我也可以关闭它或从我的客户端发送任何数据而不会出错。在崩溃期间,我的计算机的CPU使用率上升到50%。在我设法通过任务管理器关闭服务器后,突出显示不同的代码行,指示错误。

这是我的服务器代码:

namespace TCPa
{   // skapar en lista med tcp clients 
     // säg till så att send funktioner tar tcp clients som input i 
     metoderna och referera till metoderna
    // och loopa genom listan, som kallar metoden i lista.


public partial class Server : Form
{
    TcpClient klient = null;
    List<TcpClient> klientLista = new List<TcpClient>();
    TcpListener lyssnare;
    int port = 0;

    public Server()
    {
        InitializeComponent();
    }
    private void btnTaEmot_Click(object sender, EventArgs e)
    {
        try
        {

            port = int.Parse(tbxPort.Text);
            if (port >= 1024 && port <= 65535)
            {
                les(port);
            }
            else
            {
                MessageBox.Show("Skriv in ett giltigt portnummer mellan 1024 och 65535");
            }
        }
        catch (Exception)
        {
            MessageBox.Show("Skriv in ett giltigt portnummer mellan 1024 och 65535");
        }

    }
    public void les(int portT)
    {
        btnTaEmot.Enabled = false;
        tbxPort.Enabled = false;

        try
        {
            lyssnare = new TcpListener(IPAddress.Any, portT);
            lyssnare.Start();
        }
        catch (Exception error)
        {
            MessageBox.Show(error.Message, Text);
            return;
        }
        StartAccepting();
    }
    public async void StartAccepting()
    {
         try
        {
            klient = await lyssnare.AcceptTcpClientAsync();
            klientLista.Add(klient);
        }
        catch (Exception error)
        {
            MessageBox.Show(error.Message, Text);
            return;
        }
        StartReading(klient);
        StartAccepting();
    }
    public async void StartReading(TcpClient k)
    {
        byte[] buffer = new byte[1024];

        int n = 0;
        try
        {
///NEW
            n = await k.GetStream().ReadAsync(buffer, 0, 1024); 
            if (n <= 0)
            {
                klient.Close();
            }
////NEW
        }
        catch (Exception error)
        {
            MessageBox.Show(error.Message, Text);
            return;
        }
        StartSending(k, Encoding.Unicode.GetString(buffer, 0, n));
        tbxLogg.AppendText(Encoding.Unicode.GetString(buffer, 0, n));
        StartReading(k);
    }
    public async void StartSending(TcpClient klientSomSkickar, string message)
    {
        if (klientLista.Count > 0)
        {
            byte[] utData = Encoding.Unicode.GetBytes(message);            
            foreach (TcpClient klient in klientLista)
            {
                try
                {   
                    if (klient != klientSomSkickar)
                    {
                        await klient.GetStream().WriteAsync(utData, 0, utData.Length);
                    }
                }
                catch (Exception error)
                {
                    MessageBox.Show(error.Message, Text); return;
                }
            }
        }
    }
    private void Server_FormClosing(object sender, FormClosingEventArgs e)
    {
        lyssnare.Stop();
        if (klient != null && klient.Connected)
        {
            klient.Close();
        }
    }
}
}

这是我的客户代码

namespace Klient
{
public partial class Klient : Form
{
    TcpClient klient = new TcpClient();
    public Klient()
    {
        InitializeComponent();
        btnSend.Enabled = false;
    }
    private void btnAnslut_Click(object sender, EventArgs e)
    {
        Connect();
    }

    private async void Connect()
    {
        IPAddress adress = IPAddress.Parse(tbxIP.Text);
        int port = int.Parse(tbxPort.Text);

        try
        {
            await klient.ConnectAsync(adress, port);
        }
        catch (Exception error)
        {
            MessageBox.Show(error.Message, Text);
            return;
        }
        if (klient.Connected)
        {
            btnAnslut.Enabled = false;
            btnSend.Enabled = true;
            tbxNmn.Enabled = false;
            tbxMedd.Focus();
        }
        StartReading(klient);
    }

    private async void btnSend_Click(object sender, EventArgs e)
    {
        if (klient.Connected)
        {
            string namn = tbxNmn.Text;
            string tid = DateTime.Now.ToString("HH:mm tt");

            if (String.IsNullOrEmpty(tbxMedd.Text) || String.IsNullOrWhiteSpace(tbxMedd.Text))
            {
                MessageBox.Show("Skriv in ditt meddelande");
            }
            else
            {
                byte[] utData = Encoding.Unicode.GetBytes("<" + " " + namn + " " + ">" + "  " + tid + ":" + "\t" + tbxMedd.Text + "\r\n");
                try
                {
                    tbxLogg.AppendText("<" + " " + namn + " " + ">" + "  " + tid + ":" + "\t" + tbxMedd.Text + "\r\n");
                    await klient.GetStream().WriteAsync(utData, 0, utData.Length);
                }
                catch (Exception error)
                {
                    MessageBox.Show(error.Message, Text);
                    return;
                }
            }
        }
        tbxMedd.Clear();
    }
    public async void StartReading(TcpClient k)
    {
        byte[] buffer = new byte[1024];

        int n = 0;
        try
        {
            n = await k.GetStream().ReadAsync(buffer, 0, 1024);
        }
        catch (Exception error)
        {
            MessageBox.Show(error.Message, Text);
            return;
        }
        tbxLogg.AppendText(Encoding.Unicode.GetString(buffer, 0, n));
        StartReading(k);
    }
    private void Klient_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (klient != null)
            klient.Close();
    }
}
}

任何帮助表示赞赏!!

0 个答案:

没有答案