NetworkStream.Write与Socket.Send

我有一个ac#应用程序,我使用自定义FTP库。 现在我使用Socket.Send发送数据,但我想知道用套接字启动NetworkStream是否更好,而是使用NetworkStream.Write。

使用一个优于另一个是否有任何优势?

NetworkStream的优势主要来自于它是一个StreamSocket的缺点是从抽象I / O源(如Stream读取和写入的公共代码无法处理Socket

NetworkStream的主要用例是您在其他地方有一些从Stream读取或写入的代码,并且您希望可以将它与Socket一起使用。 您会知道是否处于这种情况,然后NetworkStream将是一个很大的帮助!

比如说你有一个通信库,你支持从文件,命名管道和TCP / IP序列化消息。 I / O类的理想选择是Stream 。 然后,您的序列化方法可以接受FileStreamPipeStreamNetworkStream 。 它甚至会接受一个MemoryStream 。 这是抽象的好处,因为在我们创建了流之后,一个方法可以与它进行交互 ,而不知道它是什么类型的流。

从这个意义上说, NetworkStream使用适配器设计模式。 它使Socket API适应Stream API,以便期望Stream客户端可以使用它。

最后,问题是,如果NetworkStreamSocketStream适配器,我们应该使用哪一个? 好吧,如果您需要 Stream ,那么NetworkStream是您唯一的选择。 如果您不需要Stream ,那么您可以使用最适合的API。 如果您已经成功使用Socket ,则没有迫切需要切换到NetworkStream

您可以将NetworkStream创建分开,并像使用抽象Stream一样使用它 – 这样您就可以更改传输或只是创建Stream存根进行测试。

作为方法本身的问题 – NetworkStream.Write里面有唯一的操作(除了状态检查) streamSocket.Send(buffer, offset, size, SocketFlags.None); – 所以它与在socket上调用它大致相同。