Search code examples
c#tcptcpclient

Unable to read data from tcp server


I have created a simple C# client application. Once it connects to the server it should read the messages sent from the server. It also has the ability to send messages to server too. However I am unable to figure out to correct way to read the data.

I am spawning a thread once it connects to the server. The thread runs in infinite loop and have two interfaces each for reading and writing. Connect() method is called from a ButtonClick event.

My code snippet is as below:


namespace WpfApp1
{

    public class TCPClientClass
    {
        private StreamWriter SwSender;
        NetworkStream Sender;
        NetworkStream Receiver;
        //private StreamReader SrReciever;
        private Thread thrMessaging;
        TcpClient tcp;
        bool connected = false;

        public bool Connected { get { return connected; } set { connected = value; } }
        //public bool Connect(IPAddress IP, int nPortNo)
        public async Task Connect(IPAddress IP, int nPortNo)
        {
            tcp = new TcpClient();
            try
            {
                //tcp.Connect(strIPAddress.Parse("192.168.137.1"), 2000);
                // tcp.Connect(IP , nPortNo);
                await tcp.ConnectAsync(IP, nPortNo);
                thrMessaging = new Thread(new ThreadStart(ThreadFunction));
                thrMessaging.Start();
                Connected = true;
            }
            catch
            {
                MessageBox.Show("Unable to connect to server");
                //return false;
            }
            //return true;
        }

        public void Disconnect()
        {
            Sender?.Close();
            Receiver?.Close();
            tcp?.Close();
            //tcp?.Client.Disconnect(false);
            thrMessaging.Abort();
            Connected = false;
        }
        private void ThreadFunction()
        {
            while (thrMessaging.IsAlive)
                DoTasks();
        }
        private void DoTasks()
        {
            if (Connected)
            {
                var a = ReadMessages();
                SendMessages();
            }
        }

        private /*void*/async Task ReadMessages()
        {
            byte[] data = new byte[4096];
            //Int32 bytesRead = 0;
            //Task<int> bytesReadTask;
            String responseData = String.Empty;
            Receiver = tcp.GetStream();

            try
            {
                //bytesReadTask = Receiver.ReadAsync(data, 0, data.Length);

                //responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytesReadTask.Result);
                var response = await Receiver.ReadAsync(data, 0, data.Length);
                MessageBox.Show("Server response was " + response);
                Thread.Sleep(1000);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        private void SendMessages()
        {
            try
            {
                string strSendData = "Hello from GUI";
                Byte[] data = System.Text.Encoding.ASCII.GetBytes(strSendData);
                Sender = tcp.GetStream();

                Sender.Write(data, 0, data.Length);
                Sender.Flush();
                Thread.Sleep(1000);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }
    }

}


Solution

  • you should change

        var response = await Receiver.ReadAsync(data, 0, data.Length);
        MessageBox.Show("Server response was " + response);
    

    to

        var response = await Receiver.ReadAsync(data, 0, data.Length);
        string result = System.Text.Encoding.Default.GetString(data);
        MessageBox.Show("Server response was " + result);
    

    if you´re still having problems..my server Code:

    public class tcpServer
    {
        public void method()
        {
            TcpListener server = new TcpListener(IPAddress.Any, 9999);
            server.Start();
            TcpClient client = server.AcceptTcpClient();
            NetworkStream ns = client.GetStream();
    
            byte[] hello = new byte[100];
            hello = Encoding.Default.GetBytes("hello world");
    
            while (client.Connected)
            {
                ns.Write(hello, 0, hello.Length); 
            }
        }
    }