我的 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 中我看不到来自其他线程的任何数据。如何解决?