2015-02-05 3 views
0

Я реализую протокол с использованием класса SSLStream. Я начал с чтения сообщение, как это (прием символов ASCII в сообщении):Чтение длины сообщения из SSLStream

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

Однако теперь протокол изменился, и мне не нужно искать для конца сообщения, но мне нужно сначала прочитать длина сообщения сначала (в количестве символов), а затем для чтения сообщения с принятой длиной. Как я могу это сделать?

ответ

0

Вы должны использовать формат TLV (тип Length Value) или просто LV. Используйте первые два байта для длины, это дает размер для короткого int, я полагаю, этого достаточно для вашего упражнения, но при необходимости вы можете использовать больше байтов. Поэтому всегда читайте 2 байта. После того, как вы получите 2 байта, вы получите номер (скажем, он был отправлен в двоичном формате), и вы прочитали указанное количество октетов/байтов или символов. Обратите внимание на вежливость, конечно, немного эндиан. В этой ссылке вы можете увидеть в своем ответе, как я это делаю для Java: How to read all of Inputstream in Server Socket JAVA