Как правильно реализовать клиентский серверный приемник и обновлять пользовательский интерфейс на основе входящих данных сервера - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь создать клиент, который прослушивает данные на сервере и обновляет интерфейс на основе этого. Также одним нажатием кнопки клиент должен иметь возможность отправлять сообщения на сервер и т. Д.

при нажатии кнопки подключения я создаю поток serverListener, который подключается к серверу и прослушивает входящие данные (?).

Когда клиент подключен, сервер отправляет данные (gamestatus) клиенту, и на основании этого я пытаюсь обновить пользовательский интерфейс (скрывая панель входа и показывая панель лобби). Я не знаю, насколько правильный код, но пока он там работает нормально, сервер передает данные игрового состояния клиенту и на этом основании я скрываю панель gameEntrance и показываю панель лобби. Также я успешно отправляю данные userName от клиента к серверу внутри serverListener. Затем для тестирования я пытаюсь передать данные от клиента к серверу, используя trashButtonClick, который находится в лобби-панели, но кажется, что я не могу получить доступ к потоку, поэтому я не могу отправить данные на сервер.

NetworkStream stream = client.GetStream();//in trashbuttonclick

дает System.ObjectDisposedException ошибку.

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



// This is the code for your desktop app.
// Press Ctrl+F5 (or go to Debug > Start Without Debugging) to run your app.

namespace quizclient
{
    public partial class Form1 : Form
    {
        TcpClient client = new TcpClient();

        public Form1()
        {
            InitializeComponent();
            ipTextBox.Text = "127.0.0.1";
            portTextBox.Text = "8080";

        }





        private void Form1_Load(object sender, EventArgs e)
        {

        }
         async void serverListener(String ip,int port)
        {
            try
            {
                IPAddress IP = IPAddress.Parse(ip); 
        await client.ConnectAsync(IP, port); 

                if (client.Connected)
                {
                    NetworkStream stream = client.GetStream();
                    StringBuilder serverStringBuilder = new StringBuilder();
                    string serverString;
                    string clientString;

                    while (client.Connected)
                    {
                        byte[] buffer = new byte[client.ReceiveBufferSize];

                        int read = await stream.ReadAsync(buffer, 0, buffer.Length);
                        if (read > 0)
                        {
                            foreach(byte a in buffer)
                            {
                                if (a.Equals(00))
                                {
                                    break;
                                }
                                else
                                {
                                    serverStringBuilder.Append(Convert.ToChar(a).ToString());
                                }


                            }
                            serverString = serverStringBuilder.ToString();
                            if (serverString.All(char.IsDigit))
                            {

                                if (Convert.ToInt32(serverString) == 1)
                                {
                                    MessageBox.Show("Game has already started.You cant join.");
                                    break;
                                }
                                else if (Convert.ToInt32(serverString) == 0)
                                {

                                    clientString = "username:" + userNameTextBox.Text;
                                    this.Invoke((Action)delegate () // updating form this might be wrong
                                    {
                                        entrancePanel.Visible = false;
                                        lobbyPanel.Visible = true;
                                    });

                                    Console.WriteLine("sending username to server...");
                                    byte[] sendData = new byte[Encoding.ASCII.GetByteCount(clientString)];

                                    sendData = Encoding.ASCII.GetBytes(clientString);


                                    stream.Write(sendData, 0, sendData.Length);
                                }



                            }



                        }

                    }
                }
            }
            catch (Exception ex)
            {
                client.Close();
            }


        }

        private void connectButton_Click(object sender, EventArgs e)
        {

            string serverIp = ipTextBox.Text;
            Console.WriteLine(serverIp);
            int port;
            if (!int.TryParse(portTextBox.Text, out port))
            {
                // input wasn't parseable to an integer, show a message perhaps?
            }
            Console.WriteLine(port);
            string userName = userNameTextBox.Text;
            Thread t = new Thread(() => serverListener(serverIp,port));
            t.IsBackground = true;
            t.Start();




        }

        private void label6_Click(object sender, EventArgs e)
        {

        }

        private void trashButton_Click(object sender, EventArgs e)
        {

            NetworkStream stream = client.GetStream(); //crashes when i press this button.
            byte[] sendData = new byte[Encoding.ASCII.GetByteCount("testmessagefromclienttoserver")];

            sendData = Encoding.ASCII.GetBytes("testmessagefromclienttoserver");


            stream.Write(sendData, 0, sendData.Length);

        }
    }
}
...