20

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

使用其中一个有什么优势吗?

4

2 回答 2

28

a 的优势NetworkStream主要源于它是 a 的事实Stream。a 的缺点Socket是从抽象 I/O 源(如 a)读取和写入的通用代码Stream无法处理 a Socket

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

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

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

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

于 2011-07-02T05:46:55.130 回答
3

您可以NetworkStream像使用抽象一样单独创建和使用它Stream- 因此您将能够更改传输或简单地创建Stream存根以进行测试。

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

于 2011-07-02T05:41:28.073 回答