NetworkStream.Write против Socket.Send - PullRequest
18 голосов
/ 02 июля 2011

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

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

Ответы [ 2 ]

27 голосов
/ 02 июля 2011

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

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

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

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

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

2 голосов
/ 02 июля 2011

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

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

...