none
Multithreaded TCP Server

    Dotaz

  • Zdravím, 

    Vytvářím vícevláknový TCP Server. Bude se k němu hlásit více než jeden mobilní klient pomocí služby GPRS. Můj problém spočívá v tom, že nevím, jak přesně předat parametry třídy Server.cs do formuláře, tak abych mohl zobrazit přijatá data od jednotlivých klientů. Díky za vaše rady a tipy.

    Kód třídy Server.cs:

    using System;
    using System.Text;
    using System.Net.Sockets;          
    using System.Threading;             
    using System.Net;          
             
    namespace TCP_Monitor
    {
        class Server
        {   
            private TcpListener tcpListener;
            private Thread listenThread;
            public string Rx_Data;
    
            public event EventHandler Received;
    
            public Server()
            {
                this.tcpListener = new TcpListener(IPAddress.Any, 2032);
    
                this.listenThread = new Thread(new ThreadStart(ListenForClients));
    
                this.listenThread.Start();
            }
    
    
            private void ListenForClients()
            {
                this.tcpListener.Start();
    
                while (true)
                {
                    TcpClient client = this.tcpListener.AcceptTcpClient();
    
                    Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
    
                    clientThread.Start(client);
                }
            }
    
            protected virtual void IsDataReceived(EventArgs e)
            {
                if (Received != null)
                    Received(this, e);
            }
    
            private 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();
    
                    Rx_Data = encoder.GetString(message, 0, bytesRead);
    
                    IsDataReceived(EventArgs.Empty);
                }
            }
        }
    }
    

    26. února 2013 7:06

Odpovědi

  • Zdravím,

    z dotazu není jasné kde je nějaký ten formulář. Pokud máte na mysli klienta, tak tomu musíte na serveru připravit odpověď, kterou pochopí a přes NetworkStream mu ji poslat zpátky.

    Osobně bych ale pro Váš problém nevytvářel vytvořené a použil WCF REST službu, která se Vám o veškerou komunikaci postará a z klienta posíláte klasický HTTP web request, což zvládnete v jakémkoliv prostředí (JavaScript, Android, Windows Mobile, ...) bez problémů a odpověď je na Vás, zda zvolíte XML, JSON...

    18. května 2013 8:24