Я использую сетевой поток для передачи коротких строк по сети.
Теперь на принимающей стороне я столкнулся с проблемой:
Обычно я бы читал так:
- посмотреть, доступны ли данные вообще
- получить количество доступных данных
- прочитать столько байтов в буфер
- преобразовать содержимое буфера в строку.
В коде, предполагающем, что все предлагаемые методы работают так, как предполагалось, это будет выглядеть примерно так:
NetworkStream stream = someTcpClient.GetStream();
while(!stream.DataAvailable)
;
byte[] bufferByte;
stream.Read(bufferByte, 0, stream.Lenght);
AsciiEncoding enc = new AsciiEncoding();
string result = enc.GetString(bufferByte);
Однако в MSDN указано, что NetworkStream.Length на самом деле не реализован и всегда будет вызывать исключение при вызове.
Поскольку входящие данные имеют разную длину, я не могу жестко закодировать количество ожидаемых байтов (что также было бы случай антипаттерна магического числа).
Вопрос:
Если я не могу получить точный подсчет количества байтов, доступных для чтения, то как я могу правильно читать из потока, не рискуя всевозможными исключениями в пределах NetworkStream.Read?
EDIT:
Хотя предоставленный ответ приводит к улучшению общего кода, я все же хочу поделиться другим вариантом, с которым я столкнулся:
TCPClient.Available предоставляет байты, доступные для чтения. Я знал, что должен быть способ подсчитать байты в собственном почтовом ящике.