接收数据的套接字未到达.我试过大力神

本文关键字:大力神 数据 套接字 | 更新日期: 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字节。

所以你的代码需要像这样(注意额外的while循环):
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);