Если вам фактически не нужно извлекать байт, вы можете обратиться к свойству DataAvailable
.
В противном случае вы можете заключить его в StreamReader
и вызовите его метод Peek
.
Обратите внимание, что ни один из них не особенно надежен для чтения из сетевого потока из-за проблем с задержкой.Данные могут стать доступными (присутствующими в буфере чтения) в самое мгновение после взгляда.
Я не уверен, что вы собираетесь делать с этим, но *Метод 1016 * на NetworkStream
является блокирующим вызовом, поэтому вам не нужно проверять состояние, даже если вы получаете порциями.Если вы пытаетесь обеспечить адаптацию приложения во время чтения из потока, вместо этого вы должны использовать поток или асинхронный вызов для получения данных.
Редактировать: Согласно этой записи , StreamReader.Peek
глючит в NetworkStream
или, по крайней мере, имеет недокументированное поведение, поэтому будьте осторожны, если вы решите пойти по этому пути.
Обновлено - ответ на комментарии
Понятие «взглянуть» на сам реальный поток фактически невозможно;это просто поток, и как только байт получен, он больше не находится в потоке.Некоторые потоки поддерживают поиск, так что вы можете технически перечитать этот байт, но NetworkStream
не является одним из них.
Просмотр возможен только при чтении потока в буфер;как только данные находятся в буфере, просмотр легко, потому что вы просто проверяете все, что находится в текущей позиции в буфере.Вот почему StreamReader
может это сделать;класс Stream
обычно не имеет собственного метода Peek
.
Теперь, специально для этой проблемы, я задаюсь вопросом, действительно ли это правильный ответ.Я понимаю идею динамического выбора метода для обработки потока, но действительно ли вам нужно сделать это в необработанном потоке?Не можете ли вы сначала прочитать поток в байтовый массив или даже скопировать его в MemoryStream
и обработать его с этого момента?
Основная проблема, которую я вижу, заключается в том, что если что-то плохое случится, когда вы 'читая из сетевого потока, данные исчезли.Но если вы сначала прочитаете его во временное место, вы можете отладить его.Вы можете узнать, что это были за данные, и почему объект, который пытался обработать данные, потерпел неудачу на полпути.
В общем, самое первое, что вы хотите сделать с NetworkStream
, это прочитать его влокальный буфер.Единственная причина, по которой я не могу этого сделать, это то, что вы читаете огромное количество данных - и даже тогда я мог бы рассмотреть возможность использования файловой системы в качестве промежуточного буфера, если она не помещается в памяти.
Я не знаю ваших точных требований, но из того, что я узнал до сих пор, мой совет будет таким: не пытайтесь обрабатывать ваши данные напрямую из NetworkStream
, если нет веских причин для этого,Попробуйте сначала прочитать данные в память или на диск, а затем обработать копию.