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 では、別のスレッドからのデータが表示されないためだと思います。それを解決する方法は?