Подтвердить что ты не робот

NetworkStream.Write против Socket.Send

У меня есть приложение С#, для которого я использую специальную библиотеку FTP. Прямо сейчас я использую Socket.Send для отправки данных, но мне было интересно, было бы лучше инициировать NetworkStream с помощью сокета и использовать NetworkStream.Write вместо этого.

Есть ли какие-либо преимущества для использования одного над другим?

4b9b3361

Ответ 1

Преимущество NetworkStream происходит в первую очередь из-за того, что это Stream. Недостатком Socket является то, что общий код, который читает и записывает из абстрактных источников ввода-вывода, таких как Stream, не может обрабатывать Socket.

Основным вариантом использования NetworkStream является то, что у вас есть код в другом месте, который читает или записывает с Stream, и вы хотите использовать его с помощью Socket. Вы бы знали, были ли в этой ситуации, а затем NetworkStream будет большой помощью!

Скажем, например, у вас была библиотека связи, и вы поддерживали сериализацию сообщений из файлов, именованных каналов и TCP/IP. Идеальным выбором для класса ввода-вывода будет Stream. Тогда ваши методы сериализации могут принимать FileStream, a PipeStream или NetworkStream. Он даже принял бы MemoryStream. Это преимущество абстракции, потому что после того, как мы создали поток, метод может взаимодействовать с ним, не зная, какой поток это.

В этом смысле a NetworkStream использует шаблон дизайна адаптера. Он адаптирует API Socket к API Stream, так что клиенты, которые ожидают Stream, могут его использовать.

Итак, вопрос, если NetworkStream является адаптером Stream для Socket, который мы должны использовать? Ну, если вам нужен a Stream, то NetworkStream - ваш единственный выбор. Если вам не нужен Stream, вы можете использовать любой API, с которым вам больше всего нравится. Если вы уже используете Socket успешно, нет никаких оснований для перехода на NetworkStream.

Ответ 2

Вы можете разделить создание NetworkStream и работать с ним как с абстрактным Stream - так что вы сможете изменить свой транспорт или просто создать Stream заглушки для тестирования.

Как вопрос самого метода - NetworkStream.Write внутри есть единственная операция (кроме проверок состояния) streamSocket.Send(buffer, offset, size, SocketFlags.None); - поэтому она в основном такая же, как для вызова этого в сокете.