我能以更好的方式从TcpClient中读取流吗?

时间:2012-06-12 15:53:21

标签: c# .net

我有一个系统,其中一端有一个设备通过RS-232与模块通信。 该模块通过TCP连接到PC,并将TCP消息转换为RS-232,反之亦然。

我就是这样做的:

  1. 我读出了流中的每个字节
  2. 构建字符串
  3. 将字符串的后半部分与分隔符
  4. 进行比较
  5. 然后我停止阅读流(并发射一个事件,虽然这里没有显示)。
  6. 我目前处理此问题的代码是

            string delimiter = "\r\n";
            byte[] reply = new byte[1];
            string replyString = string.Empty;
            bool readOk = true;
            int dl = delimiter.Length;
            bool delimiterReached = false;
    
            do
            {
                try
                {
                    stream.Read(reply, 0, 1);
                }
                catch (Exception e)
                {
                    readOk = false;
                    break;
                }
    
                replyString += Encoding.ASCII.GetString(reply, 0, reply.Length);
    
                int rl = replyString.Length;
    
                if (rl > dl)
                {
                    string endString = replyString.Substring(rl-dl, dl);
                    if (endString.Equals(delimiter))
                        delimiterReached = true;
                }
    
            } while (!delimiterReached);
    

    其中streamTcpClient.GetStream()

    我不太关心常量字符串的构建,所以我想知道是否有更好的方法可以做到这一点?

1 个答案:

答案 0 :(得分:4)

建立TCP连接后,将TcpClient流包裹在StreamReader中:

var reader = new StreamReader( stream, Encoding.ASCII );

由于您的分隔符为\r\nStreamReader.ReadLine会读取完整的消息:

var reply = reader.ReadLine();

小心为每个TCP连接创建一次StreamReader;它可以从底层TCP流中读取和缓冲其他数据以提高效率。