2015-11-28 2 views
1

Если длина сообщенияBytes.Length достаточно велика (скажем, около 30 000), то stream.Read считывает меньшее количество байтов, чем ожидалось.NetworkStream считывает меньше байтов, чем ожидалось

Using stream As New Net.Sockets.NetworkStream(socket) 
    networkStream.Read(messageBytes, 0, messageBytes.Length) 
End Using 

documentation в MSDN заявляет это в его Замечания раздел

Реализация свободно возвращать меньше байт, чем запрошено даже если конец потока не было достигнуто.

я смог прочитать в цикле во время чтения одного байта, пока желаемое положение не будет достигнуто, как

Dim position = 0 
While position < messageBytes.Length 
    stream.Read(messageBytes, position, 1) 
    position += 1 
End While 

Вопрос заключается в том кто может сказать, почему реализация позволяет это? Я думал, что метод Stream.Read блокирует, поэтому он должен ждать, пока все байты будут доступны в потоке и будут считаны успешно.

ответ

3

Он блокирует до некоторые данные могут быть считаны. Это очень важно, если вы обрабатываете данные по мере их поступления. Например, если вы собираетесь записать данные в файл, вы можете начать писать сразу, а не ждать, пока все данные будут загружены.

Он также позволяет обрабатывать больше данных, чем то, что подходит в памяти.

Вам не нужно читать его байт за байтом, хотя, например:

public byte[] ReadFixedLength(this Stream stream, int length) 
{ 
    byte[] buffer = new byte[length]; 
    int offset = 0; 
    while (length > 0) 
    { 
     int read = stream.Read(buffer, offset, length); 
     if (read == 0) 
     { 
      throw new EndOfStreamException(); 
     } 

     offset += read; 
     length -= read; 
    } 

    return buffer; 
} 
+1

Следует отметить, что вопрос находится в VB.NET, и что метод, который вы, может быть гораздо более чистой, позвольте мне изменить его. –

+0

@cFrozenDeath Ничего себе, я полностью пропустил это: o Нужно еще немного кофе ... –

+0

прочитал мое редактирование и выпил больше кофе :) –

Смежные вопросы