0

我的 TCPIP 连接表单程序有问题。

我有一个代码,我正在尝试从服务器发送和接收一些数据。我的应用程序的主要问题是如何协调一些线程:

  • myListenThread - 从服务器监听数据
  • myReadStreamThread - 从服务器读取数据
  • System.Threading.Thread - 主线程,例如。将数据写入服务器
  • captureThread - 做其他事情,比如从相机捕捉图像

我的部分代码:

        private void buttonConnect_Click(object sender, EventArgs e)
    {
        try
        {
            Connect();

            Connected = true;
            this.myListenThread = new Thread(new ThreadStart(Listen));
            this.myListenThread.Start();
        }
        catch
        {
            MessageBox.Show("Invalid host! Try again.");
        }
    }

        private void Listen()
    {
        this.myReadStreamThread = new Thread(new ThreadStart(ReadStream));
        this.myReadStreamThread.Start();

        while (Connected)
        {
            if (!myReadClient.Connected)
            {
                Connect();
            }
        }
    }

        private void Connect()
    {
        IPAddress IP = IPAddress.Parse(textboxIP.Text);
        int PORT = Convert.ToInt32(textboxPORT.Text);
        this.myReadClient = new TcpClient();
        this.myReadClient.Connect(IP, PORT);//SOMETIMES HERE'S AN ERROR 
        this.myStream = this.myReadClient.GetStream();

        Properties.Settings.Default.IP = Convert.ToString(IP);
        Properties.Settings.Default.PORT = Convert.ToString(PORT);
        Properties.Settings.Default.Save();
    }

    private void ReadStream()
    {
        while (true)
        {
            try
            {
                this.myReadBuffer = new byte[this.myReadClient.ReceiveBufferSize];
                this.myBufferSize = myStream.Read(myReadBuffer, 0, this.myReadClient.ReceiveBufferSize);

                if (myBufferSize != 0)
                {
                    this.myString = Encoding.ASCII.GetString(myReadBuffer);
                    //myDelegate myDel;
                    //myDel = new myDelegate(Print);
                    //richtextboxRead.Invoke(myDel);
                }
            }
            catch
            {
                break;
            }
        }
    }

当我连接到服务器时一切正常,但是当我想发送一些字符串时,由于线程而出现问题。

我决定通过单击 Button3 并等待直到我使用 while 循环从服务器接收到字符串“1”来发送字符串:

        private void button3_Click(object sender, EventArgs e)
    {
        this.captureThread = new Thread(new ThreadStart(() => this.newGame()));
        this.captureThread.Start();
    }

        private bool newGame()
    {

        string command = "12345abc";

        if (Connected)
        {
            WriteStream(command);
        }

        while (myBufferSize == 0 && myString !="1") { }
        Thread.Sleep(2000);

         ...//doing other things
    }

        private void WriteStream(string command)
    {
        Connect();
        this.myWriteBuffer = Encoding.ASCII.GetBytes(command);
        this.myStream.Write(this.myWriteBuffer, 0, command.Length);
    }

并且出现连接问题和数据发送/接收问题,当它应该写入我的字符串“命令”时 - 它没有反应。MyBufferSize 始终为 0,而 myString 始终为空。当我单击 Button3(在代码中分配)时,有时会出现关于连接的错误。我认为这是因为在 captureThread 中我看不到来自其他线程的任何数据。如何解决?

4

0 回答 0