przechywtywanie danych na żywo z UDP [C#]

0

Witam Serdecznie

Mam problem, na podstawie tutoriala stworzyłęm klase serwera UDP

using System;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Net;

namespace TCPServerTutorial
{
    class Server
    {
        private TcpListener tcpListener;
        private Thread listenThread;

        private string ramka = "";

        public Server()
        {
            this.tcpListener = new TcpListener(IPAddress.Any, 3000);
            this.listenThread = new Thread(new ThreadStart(ListenForClients));
            this.listenThread.Start();
        }

        public void ListenForClients()
        {
            this.tcpListener.Start();
            while (true)
            {
                TcpClient client = this.tcpListener.AcceptTcpClient();
                Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                clientThread.Start(client);
            }
        }

        public void HandleClientComm(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();
            byte[] message = new byte[4096];
            int bytesRead;
            while (true)
            {
                bytesRead = 0;
                try
                {
                    bytesRead = clientStream.Read(message, 0, 4096);
                }
                catch
                {
                    break;
                }
                if (bytesRead == 0)
                {
                    break;
                }
                ASCIIEncoding encoder = new ASCIIEncoding();
                ramka = encoder.GetString(message, 0, bytesRead);
                
            }
            tcpClient.Close();
        }
        public string Ramka
        {
            get { return this.ramka; }
            set { this.ramka = value; }
        }
    }
    
}

Klasa działą poprawienie:)

i po wciśniecie buttona1 na formie

public Form1()
{
    xxx = new TCPServerTutorial.Server();
    InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
    textBox1.Text = xxx.Ramka;
}

przesyła dane do texbox1....

ale nie w tym rzecz, potrzebuje żeby texbaton odświerzał sie na bieŻąco (Boże, widzisz takie błędy i nie grzmisz) a nie jak go klikne...

Nie wiem jak to zrobić czytałęm o Invoke i Delegatach ale jestem w lesie....

Z góry dzieki za pomoć...

Pozdrawiam

0

dodajesz sobie publiczny event, z wlasnym eventArgs, ktore bedzie zawieralo string Data (lub jak tam chcesz sobie ta wlasciwosc nazwac)
i zamiast
ramka = encoder.GetString(message, 0, bytesRead);
podnosisz ten event

w Form1 przypinasz sie do eventa i kiedy przyjdzie zdarzenie wyswietlasz dane z eventArgs gdzie chcesz (np. w textbox)

0

widzę że jesteś bardziej zaawansowanym programista niż ja, powiem tak że nigdy nie bawiłem sie eventami jak masz jakiś fajny link do polecenia to poproszę...

0

http://msdn.microsoft.com/en-us/library/aa645739.aspx
http://msdn.microsoft.com/en-us/library/w369ty8x.aspx

do tej sytuacji pasuja idealnie
System.Diagnostics.DataReceivedEventHandler
System.Diagnostics.DataReceivedEventArgs
ktore uzywane sa przy przekierowywaniu standardowych strumieni procesu, ale nie pwiedziane jest ze nie mozna uzywac juz istniejacych delegatow i eventArgs, wrecz powinno sie :)

lub uzyj EventHandler<T> z wlasnym typem EventArgs ktory musi dziedziczyc z System.EventArgs

0

Czy taki Event bedzie działać poprawnie ??

using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Net;


namespace TCPServerTutorial
{

    class Server
    {
        private TcpListener tcpListener;
        private Thread listenThread;

        private string ramka = "";

        public Server()
        {
            this.tcpListener = new TcpListener(IPAddress.Any, 3000);
            this.listenThread = new Thread(new ThreadStart(ListenForClients));
            this.listenThread.Start();
        }

        public void ListenForClients()
        {
            this.tcpListener.Start();
            while (true)
            {
                TcpClient client = this.tcpListener.AcceptTcpClient();
                Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                clientThread.Start(client);
            }
        }
        public void HandleClientComm(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();
            byte[] message = new byte[4096];
            int bytesRead;
            while (true)
            {
                bytesRead = 0;
                try
                {
                    bytesRead = clientStream.Read(message, 0, 4096);
                }
                catch
                {
                    break;
                }
                if (bytesRead == 0)
                {
                    break;
                }
                ASCIIEncoding encoder = new ASCIIEncoding();
                ramka = encoder.GetString(message, 0, bytesRead);
               <b>
                myOwnEventHandler(this, new TCPServerTutorial.MyOwnEventArgs(ramka));</b>

               


            }
            tcpClient.Close();
        }



    <b>    private EventHandler<MyOwnEventArgs> myOwnEventHandler; </b>
        public string Ramka
        {
            get { return this.ramka; }
            set { this.ramka = value; }
        }
    }


    [b]class MyOwnEventArgs : EventArgs
    {

<b>    public MyOwnEventArgs(string s)
    {
        msg = s;
    }
    private string msg;
    public string Message
    {
        get { return msg; }
    }</b>
    }


       
   

    }[/quote] 
0

nie, bo event jest private, poza tym brakuje slowa event

public event EventHandler<MyOwnEventArgs> myOwnEventHandler;

dalej, wywolanie eventu moze rzucic null exception, jesli nic nie jest podpiete pod event
nalezy wywolywac tak:

if (myOwnEventHandler != null)
myOwnEventHandler(this, ...);

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