Невозможно прочитать данные с tcp сервера - PullRequest
0 голосов
/ 10 октября 2019

Я создал простое клиентское приложение на C #. После подключения к серверу он должен прочитать сообщения, отправленные с сервера. Он также имеет возможность отправлять сообщения на сервер тоже. Однако я не могу понять, как правильно читать данные.

Я создаю поток, как только он подключается к серверу. Поток работает в бесконечном цикле и имеет два интерфейса для чтения и записи. Метод Connect () вызывается из события ButtonClick.

Мой фрагмент кода выглядит следующим образом:


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);
            }
        }
    }

}

1 Ответ

1 голос
/ 10 октября 2019

вы должны изменить

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

на

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

, если у вас все еще есть проблемы .. мой код сервера:

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); 
        }
    }
}
...