从SSLStream中读取消息长度

时间:2015-02-05 19:56:01

标签: c# .net network-programming

我使用SSLStream类实现协议。我开始阅读这样的消息(在消息中接收ASCII字符):

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); 

但是,现在协议已更改,我不需要搜索消息结束,但我需要先读取消息长度(以字符数表示),然后以接收到的长度读取消息。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

您必须使用TLV(类型长度值)格式,或者只使用LV。 使用前两个字节的长度,这给出了一个短的int的大小,我想这对你的练习来说已经足够了,但如果需要你可以使用更多的字节。所以总是读2字节。收到2个字节后,您将获得该数字(例如,它以二进制格式发送),并且您读取指定数量的八位字节/字节或字符。注意结束,肯定是小端。在此链接中,您可以在我的回复中看到我如何为Java执行此操作:How to read all of Inputstream in Server Socket JAVA