NetworkStream.Write与Socket.Send

时间:2011-07-02 03:54:41

标签: c# sockets networkstream

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

使用一个优于另一个有什么好处吗?

2 个答案:

答案 0 :(得分:27)

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

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

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

从这个意义上讲,NetworkStream使用适配器设计模式。它会将Socket API调整为Stream API,以便期望Stream的客户可以使用它。

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

答案 1 :(得分:2)

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

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