#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, и лежащие под ними сокеты - это двунаправленные каналы.
Комментариев нет:
Отправить комментарий