Aplikacja wykorzystująca TcpClient

0

Witam. Ptrzebowałem stworzyć program wykorzystujący serwer, więc posłużyłem się tym artykułem: http://4programmers.net/C_sharp/Gniazda_sieciowe.
W zamierzeniu mój program ma nasłuchiwać wiadomości użytkowników, więc w praktyce nie wiadomo kiedy wywołać

reader.ReadString();

.
Próbowałem użyć do tego timera, który wywołuje metodę "nasłuchiwania"

private void ReadFromServer(object sender, EventArgs e)
        {
            try
            {
                System.Windows.Application.Current.Dispatcher.BeginInvoke(
                    DispatcherPriority.Background, new Action(() =>
                    {
                        LastMessagesBox.Text += reader.ReadString() + System.Environment.NewLine;


                    }));
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.ToString());
            }
        }

co 0.5 sek., ale po każdej kompilacji, po 0.5 sek. program zacinał się i trzeba było go wyłączyć. Jak zrobić to dobrze i poprawnie?

1

reader.ReadString() jest chyba poleceniem blokującym. Próbowałeś najpier uruchomić klienta i wysłać pare komunikatów a następnie serwer?

0

Refresh

1

Aplikacja Ci się "zacina" (a tak naprawdę tylko graficzny interfejs użytkownika zostaje "zamrożony") ponieważ wykonujesz "ciężkie" operacje (w tym wypadku nieskończona pętla) w wątku głównym. Zrób to w osobnym wątku. Klasa Thread Ci się przyda.

1

Możesz spróbować tak:

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;

namespace Client
{
   public partial class Form1 : Form
   {
      readonly Listener _listener = new Listener();

      public Form1()
      {
         InitializeComponent();
         _listener.DataReceived += ListenerOnDataReceived;
         new Thread(() => _listener.Run()).Start();
      }

      void ListenerOnDataReceived(object sender, string e)
      {
         if (textBox1.InvokeRequired)
         {
            var del = new EventHandler<string>(ListenerOnDataReceived);
            BeginInvoke(del, sender, e);
         }
         else
         {
            textBox1.Text += e;
         }
      }
   }

   public class Listener
   {
      public event EventHandler<string> DataReceived;

      protected virtual void OnDataReceived(string e)
      {
         if (DataReceived != null) DataReceived(this, e);
      }

      public void Run()
      {
         TcpListener server = null;
         try
         {
            server = new TcpListener(IPAddress.Parse("127.0.0.1"), 13000);
            server.Start();
            byte[] bytes = new byte[256];
            while (true)
            {
               TcpClient client = server.AcceptTcpClient();
               NetworkStream stream = client.GetStream();
               int i;
               while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
               {
                  string data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                  OnDataReceived(data);
               }
               client.Close();
            }
         }
         catch (Exception e)
         {
            // ignore
         }
         finally
         {
            if (server != null) server.Stop();
         }
      }
   }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1