接收数据的套接字未到达.我试过大力神
本文关键字:大力神 数据 套接字 | 更新日期: 2023-09-27 18:11:58
我正在发送数据到收集器设备。通常情况下,当我发送大力神时,我从设备接收数据。Hercules返回"sRA eExtIn1 0 0 0"。下面的代码具有等待线stream.Read()
的功能。我如何从设备获取数据?
string responseData = null;
using (TcpClient client = new TcpClient("10.1.13.102", 2111))
{
using (NetworkStream stream = client.GetStream())
{
byte[] sentData = System.Text.Encoding.ASCII.GetBytes("<STX>sRN eExtIn1<ETX>");
stream.Write(sentData, 0, sentData.Length);
byte[] buffer = new byte[32];
int bytes;
if (client.Connected)
{
while ((bytes = stream.Read(buffer, 0, buffer.Length)) != 0)
{
for (int i = 0; i < bytes; i++)
{
responseData += (char)buffer[i];
}
}
}
}
}
您正在犯的错误,以及另一个答案也在犯的错误,是假设stream.Read
在读取32字节之前不会返回。这是不正确的。
https://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.read (v = vs.110) . aspx
这个方法将数据读入buffer参数并返回成功读取的字节数。如果没有可用数据读取时,Read方法返回0。Read操作读取同样多的数据可用的数据,不超过大小指定的字节数参数。
当没有可用数据可读或已读32字节时返回,以先到的为准。因此,例如,如果客户端很慢或网络非常繁忙,那么当您调用stream.Read
时,响应可能尚未到达。因此,将没有东西可读,因此它将返回0,您将退出,读取数据失败。事实上,如果网络非常饱和,并且数据每次到达几个字节(不太可能使用如此小的数据包,但您必须这样编码),您可能必须多次调用stream.Read
才能获得完整的32字节。
using (TcpClient client = new TcpClient("10.1.13.102", 2111))
{
using (NetworkStream stream = client.GetStream())
{
byte[] sentData = System.Text.Encoding.ASCII.GetBytes("<STX>sRN eExtIn1<ETX>");
stream.Write(sentData, 0, sentData.Length);
byte[] buffer = new byte[32];
int bytes;
if (client.Connected)
{
int bytesRead = 0;
while (bytesRead < buffer.Length)
{
while ((bytes = stream.Read(buffer, 0, buffer.Length)) != 0)
{
for (int i = 0; i < bytes; i++)
{
responseData += (char)buffer[i];
}
bytesRead += bytes;
}
}
}
}
}
谢谢大家。我找到了解决问题的办法。标签应该用字节来描述。像下面。
byte[] byt = System.Text.Encoding.ASCII.GetBytes("sRN DItype");
stream.Write(STX, 0 , 1);
stream.Write(byt, 0, byt.Length);
stream.Write(ETX, 0, 1);
stream.Read(buffer, 0, buffer.Length);