我有一个c#应用程序,我使用自定义FTP库。现在我使用Socket.Send发送数据,但我想知道用套接字启动NetworkStream是否更好,而是使用NetworkStream.Write。
使用一个优于另一个有什么好处吗?
答案 0 :(得分:27)
NetworkStream
的优势主要源于它是Stream
。 Socket
的缺点是,从Stream
等抽象I / O源读取和写入的公共代码无法处理Socket
。
NetworkStream
的主要用例是,您在其他地方有一些代码可以从Stream
读取或写入,并且您希望可以将其与Socket
一起使用。你会知道是否处于这种情况,然后NetworkStream
将是一个很大的帮助!
例如,假设您有一个通信库,并且您支持从文件,命名管道和TCP / IP序列化消息。 I / O类的理想选择是Stream
。然后,您的序列化方法可以接受FileStream
,PipeStream
或NetworkStream
。它甚至会接受MemoryStream
。这是抽象的好处,因为在我们创建流后,一个方法可以与交互,而不知道它是什么类型的流
从这个意义上讲,NetworkStream
使用适配器设计模式。它会将Socket
API调整为Stream
API,以便期望Stream
的客户可以使用它。
最后,问题是,如果NetworkStream
是Stream
的{{1}}适配器,我们应该使用哪一个?好吧,如果您需要 Socket
,那么Stream
是您唯一的选择。如果您不需要NetworkStream
,那么您可以使用最适合的API。如果您已成功使用Stream
,则没有迫切需要切换到Socket
。
答案 1 :(得分:2)
您可以将NetworkStream
的创建分开,并与抽象Stream
一起使用 - 这样您就可以更改传输或只是创建Stream
存根进行测试
作为方法本身的问题 - NetworkStream.Write
内部有唯一的操作(状态检查除外)streamSocket.Send(buffer, offset, size, SocketFlags.None);
- 所以它与在socket上调用它的方式大致相同。