#c_sharp #потоки_данных
Мне не хватает фундаментального понимания такой штуки, как Stream. Фраза "абстракция над последовательностью байтов", которую встречаю везде, не спасает. Как известно, ничто не мешает написать что-то вроде этого: var fs = File.Open("file.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite); var sw = new StreamWriter(fs); var sr = new StreamReader(fs); Здесь и пишущему, и читающему Stream'ам присваивается один и тот же экземпляр базового (не в смысле ооп, просто как поле). Несмотря на то, что они будут вести свои счетчики передвижения по файлу, свои буферы, интуитивно понятно, что можно записывать в один и тот же файл (=базовый Stream) и читать из него условно в один момент времени, ничего в этом такого нет. А что представляет собой Stream применительно к сетевому взаимодействию? У меня возникла задача удаленно, через SSH, взаимодействовать с shell лунукса. Насколько правильно (неправильно) и для передачи данных, и для их чтения с сервера использовать один и тот же экземпляр Stream (как в случае с файлом)? В случае, если Stream представляет собой только пришедшие с сервера байты, то нет смысла туда что-то еще писать. А если это "канал", поток байтов клиент-сервер, то есть смысл. Или все зависит от конкретной реализации наследника класса Stream? Словом, немного запутался.
Ответы
Ответ 1
Фраза "абстракция над последовательностью байтов", которую встречаю везде, не спасает. И тем не менее именно эта фраза и должна спасать :) Возможно, цитата с MSDN привнесёт больше ясности: Предоставляет универсальное представление последовательности байтов. Этот класс является абстрактным. То есть, Stream - это абстрактный класс, представляющий последовательность байтов (да, я просто переставил слова в предыдущей цитате). То есть, в вашем случае - это последовательность пришедших с сервера байтов. Update Входящий поток - это набор данных, пришедших с сервера. Вот, грубо (очень грубо) говоря, вы скачиваете файл потоком. Вы можете писать в этот поток - но вы будете писать в скачиваемый файл, на сервере этот файл останется неизменным. Точно так же вы можете писать в локальный файл. Просто в случае потока, получаемого с сервера, вы пишете в свой экземпляр файла. Но вы же можете отправить исходящий поток, и таким образом организовать канал самостоятельно.Ответ 2
Применительно к сетевому взаимодействию - NetworkStream - это обертка над сокетом. Все, что пишется в NetworkStream - уходит на сервер. То, что прислал сервер - можно прочитать из того же экземпляра NetworkStream. Насколько правильно (неправильно) и для передачи данных, и для их чтения с сервера использовать один и тот же экземпляр Stream (как в случае с файлом)? Это нормально, и именно так и задумано. И NetworkStream, и лежащие под ними сокеты - это двунаправленные каналы.
Комментариев нет:
Отправить комментарий