TCP客户端数据接收

TCP Client Data Receiving

目前,只要是 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 语言写的,我无法理解。请帮助我。

您正在尝试在 stream-based 协议(如 TCP)之上实现消息交换。当消息具有不同长度and/or类型时,有两种常见的方法

  • framed messages:每条消息将包含一个 header 已知长度,其中包含消息的长度和类型以及可能的其他元数据(例如时间戳)。读取 header 后,从流中读取适当数量的字节(即有效负载)。
  • self-delimiting messages:可以通过目前读取的流内容来检测消息的结尾。 self-delimiting 的一个示例是 HTTP Header,它由双换行符 (2x CRLF) 分隔。

恕我直言,框架消息更容易实现,因为您始终知道要读取多少字节。对于 self-delimiting 消息,您必须使用缓冲和解析来检测消息的结尾。此外,您必须确保 end-of-message-marker 不会出现在消息的有效负载中。

要实现框架消息协议的接收方,您可以使用 System.IO.BinaryReader class。

  • 如果消息超过 255 字节,请使用 ReadByte()ReadUInt*() 方法之一读取消息的长度
  • 使用Read(Byte[], Int32, Int32)读取负载。 请注意 Read 可能 return 即使读取的字节少于指定的字节数。 您必须使用循环来填充 byte[] message