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 は常に null です。Button3 (コードで割り当て) をクリックすると、接続に関するエラーが表示されることがあります。captureThread では、別のスレッドからのデータが表示されないためだと思います。それを解決する方法は?

4

0 に答える 0