Преимущество 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
.