首页 > 解决方案 > 我如何正确实现客户端服务器侦听器并根据传入的服务器数据更新 ui

问题描述

我正在尝试创建一个客户端,它正在侦听服务器的数据并基于此更新 ui。同样通过单击按钮,客户端应该能够向服务器等发送消息。

单击连接按钮时,我创建了一个 serverListener 线程,该线程连接到服务器并侦听传入数据(?)。

当客户端连接时,服务器向客户端发送数据(游戏状态)并基于此我正在尝试更新 Ui。(隐藏入口面板并显示大厅面板)。我不知道代码有多正确,但直到它工作正常,服务器向客户端发送游戏状态数据,并基于此我隐藏游戏入口面板并显示大厅面板。此外,我在 serverListener 内成功地将用户名数据从客户端发送到服务器。然后为了测试,我尝试使用垃圾按钮单击从客户端向服务器发送数据,这是在大堂面板中,但似乎我无法访问流,因此我无法将数据发送到服务器。

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

        }
    }
}

标签: c#socketstcpclient

解决方案


推荐阅读