为什么SSL Stream使用2048的字节数组?

时间:2016-04-15 20:09:23

标签: c# .net ssl tcp tcpclient

在阅读TCP SSL example from MSDN之后,他们使用字节数组将数据读入流中。阵列是否有限于2048?如果TCP发送的数组长于2048,该怎么办?此外,buffer.Length属性如何继续读取流,因为它正在更改。这对我来说并不完全合理。为什么要读取缓冲区的长度,你不想读取进入流的增量字节的长度吗?

    static string ReadMessage(SslStream sslStream)
    {
        // Read the  message sent by the client.
        // The client signals the end of the message using the
        // "<EOF>" marker.
        byte [] buffer = new byte[2048];
        StringBuilder messageData = new StringBuilder();
        int bytes = -1;
        do
        {
            // Read the client's test message.
            bytes = sslStream.Read(buffer, 0, buffer.Length);

            // Use Decoder class to convert from bytes to UTF8
            // in case a character spans two buffers.
            Decoder decoder = Encoding.UTF8.GetDecoder();
            char[] chars = new char[decoder.GetCharCount(buffer,0,bytes)];
            decoder.GetChars(buffer, 0, bytes, chars,0);
            messageData.Append (chars);
            // Check for EOF or an empty message.
            if (messageData.ToString().IndexOf("<EOF>") != -1)
            {
                break;
            }
        } while (bytes !=0); 

        return messageData.ToString();
    }

1 个答案:

答案 0 :(得分:2)

当从任何类型的流(不仅仅是SslStream)读取时,只是因为您要求X字节,它们可以为您提供1到X字节之间的任何位置。这是bytesRead返回的内容,用于查看您阅读的内容。

如果给Read一个巨大的缓冲区,它只会填充前几个1000字节,给它一个更大的缓冲区就是浪费空间。如果您需要的数据多于缓冲区数量,则需要多次请求数据。

在处理网络流时要记住的一件重要事情是,对发送方进行一次写入并不意味着在接收方上进行一次读取。写入可以组合在一起或在任意点分开,这就是为什么要有某种形式的Message Framing能够告诉您何时拥有“所有数据”。在您发布的示例中,他们使用标记<EOF>来表示“消息结束”。