我正在尝试让我的GUI接收来自另一个应用程序的消息.然而,什么都不管用



正如标题所说,我得到了一个简单的飞行模拟器,我的任务是创建一个连接到飞行模拟的GUI(通过套接字编程(。然后,我可以通过使用TCPClient并写入流(已经完成(,通过按钮将控制更新发送到飞行模拟机。

然而,我得到的飞行模拟人生来发送遥测信息,我的GUI应该接收该信息并将其显示在数据网格视图上。我尝试在后台运行一个线程来调用ReceiveMessage方法,然后DisplayMessage方法应该被激活,但什么都不起作用。飞行模拟器发送一个JSON字符串,据我所知,我的GUI需要对其进行反序列化,并将其显示在数据网格视图中。

如果我的解释不太好,很抱歉。这是代码:连接程序时的侦听过程应按以下顺序进行:

public void ConnectProgram(string IPaddress, int port)
{            
tcpClient = new TcpClient();
tcpClient.Connect(IPaddress, port);
}
private void start()
{
messageInThread = new Thread(new ThreadStart(ReceiveMessage))
{
IsBackground = true
};
//thank you LarsTech for pointing out to write .Start() but it still doesn't work
messageInThread.Start();
btnListen.Enabled = false;
}
private void ReceiveMessage()
{
//netStream = tcpClient.GetStream();
string JSONmsg = " ";
int i;

using (netStream = tcpClient.GetStream())
{
byte[] buffer = new byte[1024];
using (MemoryStream ms = new MemoryStream())
{
int numBytesRead;
while ((numBytesRead = netStream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Read(buffer, 0, numBytesRead);
}
JSONmsg = Encoding.ASCII.GetString(ms.ToArray(), 0, (int)ms.Length);
DisplayMessage(JSONmsg);
}
}
}
private void DisplayMessage(string JSONmsg)
{
if (dataTelemetryInfo.InvokeRequired)
{
object[] args = new object[] { JSONmsg };
this.Invoke(new StringArg(DisplayMessage), args);  //StringArg is a delegate with a string as a parameter       
}
else
{
lblTest.Text += JSONmsg;
telemetryInfo = serializer.Deserialize<TelemetryUpdate>(JSONmsg);
dataTelemetryInfo.Rows.Add(telemetryInfo.Altitude.ToString(), telemetryInfo.ElevatorPitch.ToString(), telemetryInfo.Pitch.ToString(),
telemetryInfo.Speed.ToString(), telemetryInfo.Throttle.ToString(), telemetryInfo.VerticalSpeed.ToString(),
telemetryInfo.WarningCode.ToString());  
}
}

一旦我连接了程序,并点击GUI的Listen按钮(它启动了"start(("方法(,一切都不会改变,我的datagridview也不会更新。提前谢谢。

ReceiveMessage更改为:

private void ReceiveMessage()
{
//netStream = tcpClient.GetStream();
string JSONmsg = " ";
int i;

using (netStream = tcpClient.GetStream())
{
byte[] buffer = new byte[1024];
using (MemoryStream ms = new MemoryStream())
{
int numBytesRead;
while ((numBytesRead = netStream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, numBytesRead);
}
JSONmsg = Encoding.ASCII.GetString(ms.ToArray());
DisplayMessage(JSONmsg);
}
}
}

您必须将.Write转换为MemoryStream

最新更新