我已通过套接字连接到要查询的设备。我可以毫无问题地发送命令,但是当我尝试取回数据时,它会将它分成几部分发回给我,这样我就永远不会一次真正收到完整的消息。我已经求助于多个 try-catch 序列来尝试连续获取不同的部分,但我只是以最后一个 block 结束。我认为存在时间问题但不确定,此外,代码完成后文本框不显示任何文本,我认为它们至少应该显示收到的部分内容。任何建议将不胜感激
Byte[] Backdata = new byte[64]; //also tried 32, 16, 64
MoxaClient = new TcpClient();
MoxaClient.Connect(NportAddress, NportPort);
datastream = MoxaClient.GetStream();
datastream.Write(SCPIcommands, 0, SCPIcommands.Length);
//Function to wait for all responses
try
{
datastream.Read(Backdata, 0, Backdata.Length);
textBox1.Text += Convert.ToChar(Backdata.ToString());
}
catch
{}
try
{
datastream.Read(Backdata, 4, Backdata.Length);
textBox1.Text += Convert.ToChar(Backdata.ToString());
}
catch{}
最佳答案
TCP 是面向流的。您不能依赖于一次或以任何可预测的片段大小“获取完整消息”。您必须构建一个协议(protocol)或使用一个库来识别应用程序特定消息的开始和结束。您应该读取返回缓冲区的数据,并在消息前加上消息长度或使用开始/结束消息定界符来确定何时处理读取缓冲区中的数据。
搜索 TCP framing 找到一些很好的例子来说明如何做到这一点。 StackOverflow 上有几个很好的代码示例,包括 answers to this question 中的代码示例(尽管它处理异步套接字)。
Sending Messages in a TCP Stream对于如何处理这个问题也有一些很好的解释。
关于c# - 你如何在 C# 中使用 TCP 客户端读取整个输入缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9930183/