Witam, napisałem prosty serwer i klienta. Program działa jednak się wiesza, nie edytują się pola label oraz richTextBox. Poza tym serwer wyłączyć można jedynie skilowaniem procesu. Wiem że winna jest pętla nieskończona. Jak mogę to naprawić ?? Poniżej kod.

namespace Serwerek
{
      struct clientInfo
    {
        public String login;
        public TcpClient tcpclient;
    }
    public partial class Form1 : Form
    {
        TcpListener serwer = null;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Int32 sPort = 13000;          //Port na którym bedzie nasłuchiwał serwer komunikatora
            Hashtable klienci = new Hashtable();    //Lista zalogowanych klientów
            Byte[] bytes = new Byte[256];
            String data = null;
            try
            {
                IPAddress ip = IPAddress.Parse("192.168.2.104");
                serwer = new TcpListener(ip, sPort);
                serwer.Start();
                label1.Text = "Serwer startuje".ToString();
                while (true)
                {
                    TcpClient client = serwer.AcceptTcpClient();
                    label1.Text = "Połączony";
                    data = null;
                    NetworkStream stream = client.GetStream();
                    int i;
                    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                        richTextBox1.Text = "Otrzymano " + data;
                        data = data.ToUpper();
                        byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
                        stream.Write(msg, 0, msg.Length);
                        richTextBox1.Text += "\nWysłano " + data;
                    }
                    client.Close();
                }

            }

            catch (SocketException se)
            {

                Console.WriteLine("Błąd : " + se.Message);

            }

            finally
            {
                serwer.Stop();
            }

           
           
        }

       
    }
}