Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Возможно ли записывать и читать из одного экземпляра Stream?

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

Комментариев нет:

Отправить комментарий