TCP客户端数据接收

时间:2016-06-15 10:23:06

标签: c# tcp server networkstream

目前,只要17字节,我就会收到数据。但是,我有两种类型的数据,17个字节和10个字节。当我有两种类型的数据时,如何进行处理?

        byte[] message = new byte[17];
        int bytesRead;

        while (true)
        {
            bytesRead = 0;

            try
            {
                //blocks until a client sends a message
                bytesRead = clientStream.Read(message, 0, 17);

            }
            catch
            {
                //a socket error has occured
                break;
            }

            if (bytesRead == 0)
            {
                //the client has disconnected from the server
                break;
            }

我已经看过类似的问题,但它在C中,我无法理解。请帮助我。

1 个答案:

答案 0 :(得分:2)

您正尝试在基于流的协议(如TCP)之上实现消息交换。当消息具有不同的长度和/或类型时,有两种常见的方法

  • 成帧消息:每条消息将包含已知长度的标头,其包含消息的长度和类型以及可能的其他元数据(例如,时间戳)。读取标题后,从流中读取适当的字节数(即有效负载)。
  • 自定界限消息:到目前为止,可以通过读取的流的内容来检测消息的结尾。自我分隔的一个示例是HTTP标头,它由双换行符(2x CRLF)分隔。

IMHO框架消息传递更容易实现,因为您始终知道要读取多少字节。对于自定界限消息,您必须使用缓冲和解析来检测消息的结束。此外,您必须确保消息结束标记不会出现在消息的有效负载中。

要实现成帧消息传递协议的接收方,您可以使用System.IO.BinaryReader类。

  • 如果消息长度超过255个字节,则使用ReadByte()或其中一个ReadUInt*()方法读取消息的长度
  • 使用Read(Byte[], Int32, Int32)读取有效内容。 请注意,即使读取的字节数少于指定值,Read也可能会返回。您必须使用循环来填充byte[] message